web-dev-qa-db-fra.com

Colonne d'impression séparée par des virgules à l'aide de la ligne de commande Awk

J'ai un problème. Je dois imprimer une colonne dans un fichier texte en utilisant awk. Cependant, les colonnes ne sont pas séparées par des espaces, mais par une seule virgule. Ressemble à ceci:

column1,column2,column3,column4,column5,column6

Comment puis-je imprimer la 3ème colonne avec awk?

52
user3364728

Essayer:

awk -F',' '{print $3}' myfile.txt

Ici, dans -F, vous dites que vous utilisez "," comme séparateur de champ.

87
SMA

Si votre seule exigence est d'imprimer le troisième champ de chaque ligne, chaque champ étant délimité par une virgule, vous pouvez utiliser couper:

cut -d, -f3 file
  • -d, définit le délimiteur sur une virgule
  • -f3 spécifie que seul le troisième champ doit être imprimé
32
Tom Fenech

Essayez ceci awk

awk -F, '{$0=$3}1' file
column3
  • , Divise les champs par ,
  • $0=$3 Définit la ligne sur le seul champ 3
  • 1 Imprimez tout. ( expliqué ici )

Cela pourrait aussi être utilisé:

awk -F, '{print $3}' file
19
Jotne

Une solution simple, bien que awk - moins en bash :

while IFS=, read -r a a a b; do echo "$a"; done <inputfile

Cela fonctionne plus rapidement pour les petits fichiers (<100 lignes) puis awk car il utilise moins de ressources (évite d’appeler les coûteux appels système fork et execve).

EDIT de Ed Morton (désolé pour le piratage de la réponse, je ne sais pas s'il existe un meilleur moyen de résoudre ce problème):

Pour mettre fin au mythe selon lequel Shell s'exécutera plus rapidement que awk pour les petits fichiers:

$ wc -l file
99 file

$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

$ time awk -F, '{print $3}' file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

Je m'attends à ce que si vous obtenez un fichier REALY suffisamment petit, le script Shell s'exécutera en un clin d'œil plus rapidement que le script awk, mais qui s'en soucie?

Et si vous ne croyez pas qu'il est plus difficile d'écrire des scripts Shell robustes que des scripts awk, regardez ce bogue dans le script Shell que vous avez posté:

$ cat file
a,b,-e,d
$ cut -d, -f3 file
-e
$ awk -F, '{print $3}' file
-e
$ while IFS=, read -r a a a b; do echo "$a"; done <file

$
2
TrueY