Comment imprimer un champ à partir d'un fichier séparé par une conduite?
Question
J'ai un fichier avec des champs séparés par des caractères de pipe et je souhaite imprimer uniquement le second champ. Cette tentative échoue:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
Y a-t-il un moyen de faire cela?
La solution
Le point clé ici est que le caractère de canal (|
) doit être échappé vers le shell. Utilisez & Quot; \|
& Quot; ou " '|'
" pour le protéger de l'interpertation du shell et lui permettre d'être transmis à awk
sur la ligne de commande.
En lisant les commentaires, je constate que l’affiche originale présente une version simplifiée du problème original qui impliquait de filtrer file
avant de sélectionner et d’imprimer les champs. Un passage grep
a été utilisé et le résultat a été transmis à awk pour la sélection du champ. Cela explique le caractère totalement inutile cat file
qui apparaît dans la question (il remplace le grep <pattern> file
).
Bien, ça va marcher. Cependant, awk est en grande partie un outil de correspondance de modèle et permet de rechercher et de travailler sur les lignes correspondantes sans avoir à appeler /<pattern>/
. Utilisez quelque chose comme:
awk -F\| '/<pattern>/{print $2;}{next;}' file
Le bit <pattern>
indique à {next;}
d'effectuer l'action qui suit sur les lignes correspondant à <=>.
L’aspect perdu <=> est une action par défaut qui passe à la ligne suivante de l’entrée. Cela ne semble pas être nécessaire, mais j'ai cette habitude d'il y a longtemps ...
Autres conseils
Ou utilisez simplement une commande:
cut -d '|' -f FIELDNUMBER
Le caractère de canal doit être échappé pour que le shell ne l'interprète pas. Une solution simple:
$ awk -F\| '{print $2}' file
Un autre choix serait de citer le caractère:
$ awk -F'|' '{print $2}' file
Et 'fichier' ne contient aucun symbole de canal, il n’affiche donc rien. Vous devriez soit utiliser 'cat file' ou simplement lister le fichier après le programme awk.