web-dev-qa-db-fra.com

obtenir les 5 premiers caractères de chaque ligne du script Shell

Voici mon sample.txt fichier qu'il contient suivant

31113    70:54:D2 - a-31003
31114    70:54:D2 - b-31304
31111    4C:72:B9 - c-31303
31112    4C:72:B9 - d-31302

Je dois écrire le script Shell en ce que je passe les 5 premiers caractères (par exemple 31113) comme identifiant d'entrée à un autre script. Pour cela, j'ai essayé cela

#!/bin/sh
filename='sample.txt'
filelines=`cat $filename`
while read -r line
do
  id= cut -c-5 $line
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"

mais cela ne fonctionne pas, cela me donne une erreur

cut: 31113: No such file or directory
cut: 70:54:D2 No such file or directory
31114
31111
31112
: No such file or directory

Comment puis-je faire ceci?

16
user2622247

Si vous voulez utiliser cut de cette façon, vous devez utiliser redirection <<< (une chaîne ici) comme:

var=$(cut -c-5 <<< "$line")

Notez l'utilisation de l'expression var=$(command) au lieu de id= cut -c-5 $line. C'est la façon d'enregistrer la commande dans une variable.

Utilisez également /bin/bash Au lieu de /bin/sh Pour le faire fonctionner.


Code complet qui fonctionne pour moi:

#!/bin/bash

filename='sample.txt'
while read -r line
do
  id=$(cut -c-5 <<< "$line")
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
26
fedorqui

Eh bien, c'est une doublure cut -c-5 sample.txt. Exemple:

$ cut -c-5 sample.txt 
31113
31114
31111
31112

À partir de là, vous pouvez le diriger vers n'importe quel autre script ou commande:

$ cut -c-5 sample.txt | while read line; do echo Hello $line; done
Hello 31113
Hello 31114
Hello 31111
Hello 31112
18
tuxdna

Plutôt que de canaliser echo dans cut, il suffit de diriger la sortie de cut directement vers la boucle while:

cut -c 1-5 sample.txt |
while read -r id; do
  echo $id
  #code for passing id to other script file as parameter
done
7
William Pursell

Peut-être que vous en avez besoin, awk peut reconnaître automatiquement les espaces blancs.

awk '{print $1}' sample.txt
3
BMW

Veuillez vérifier l'exemple simple suivant:

while read line; do id=$(echo $line | head -c5); echo $id; done < file

head -c5 est la bonne commande pour obtenir les 5 premiers caractères de la chaîne.

3
kenorb

Si vous essayez de récupérer la première colonne du fichier, essayez awk:

#!/bin/sh
filename='sample.txt'

while read -r line
do
  id=$(echo $line | awk '{print $1}')
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
1
vahid abdi

Un peu plus simple que la réponse du haut:

#!/bin/bash
filename='sample.txt'
while read -r line; do
  id=${line:0:5}
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
0
Wybo Dekker