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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top