J'ai un fichier texte divisé comme suit:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Chacune de ces colonnes sera un paramètre d'un programme, et j'aimerais que le programme soit appelé pour chaque ligne
J'espérais une boucle, quelque chose comme:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Quelle serait la meilleure façon d'accomplir quelque chose comme ça en bash?
bash
text-processing
scripting
csv
doyen
la source
la source
Réponses:
Cela devrait fonctionner si le nombre de champs est constant. Au lieu d'
echo
utiliser votre commande.la source
Vous devez utiliser un
while
avec leread
intégré:Comment ça marche
cut
instruction prend la ligne et la divise sur le délimiteur spécifié par-d
.--output-delimiter
le caractère séparateur quicut
va utiliser pour afficher les champs sélectionnés, ici nous choisissons un espace pour pouvoir mettre les différents champs dans le tableaufields
.-f1-
qu'entre en jeu.fields
, vous pouvez accéder à n'importe quel champ particulier que vous voulez avec la syntaxe${field[number]}
oùnumber
est un de moins que le numéro de champ réel que vous souhaitez puisque l'indexation de tableau est basée sur zéro dans Bash.Remarque
Pour un nombre constant de champs
Vous pouvez à la place faire quelque chose de similaire à la réponse de 1_CR :
Ce qui précède, tout en semblant plus bruyant, devrait fonctionner dans n'importe quel shell compatible POSIX, pas seulement Bash.
la source
IFS
une valeur appropriée dans l'read
invocationVous pouvez arriver
read
à diviser chaque ligne en un tableau en le,
paramétrant deIFS
manière appropriée.Ainsi, dans l'exemple ci-dessus, vous pouvez accéder à chaque élément du tableau à l'aide de son index, en commençant à 0.
la source
Ce
awk
one-liner fera ce que vous voulez:Remplacez
echo
par votre commande etf.txt
par le fichier que vous souhaitez parcourir.Brève explication:
-F,
définira,
comme délimiteur.cmd
crée la commande etsystem(cmd)
appelle la commande.la source
gnu sed peut également être utilisé.
remarquez l'utilisation de l'option e dans la commande s
la source