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?
Essayer:
awk -F',' '{print $3}' myfile.txt
Ici, dans -F, vous dites que vous utilisez "," comme séparateur de champ.
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é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
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
$