217 votes

Imprimer la deuxième colonne / champ dans `awk`

Je veux imprimer la deuxième colonne ou champ en awk. Le nombre de champs est la variable NF. Je sais que je devrais pouvoir utiliser $NF, mais je ne suis pas sûr de comment l'utiliser.

Et cela ne semble pas fonctionner :

awk ' { print ( $NF-- )  } '

12 votes

NF est l'index du dernier champ, $NF est la valeur du dernier champ

0 votes

Cela a du sens maintenant. c'est pourquoi le dollar en dehors des parenthèses fonctionne je suppose

373voto

Chris Kannon Points 1901
awk '{print $(NF-1)}'

Devrait fonctionner

2 votes

Cela ne fonctionne pas pour moi. Je reçois "title:5: command not found: NF-1" dans awk 3.1.8 sous Ubuntu.

3 votes

Je éviterais le pré/post décrément pour m'assurer de ne pas changer la valeur de $NF

0 votes

Cela se casse si vous essayez d'obtenir le troisième champ en dernier comme awk -F '.' '{print $(NF-2)}'

25voto

progz Points 71

Petit ajout à la réponse acceptée de Chris Kannon : n'imprimer que s'il y a effectivement une avant-dernière colonne.

(
echo       | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1     | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2   | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)

24voto

Steve Points 191

C'est le plus simple:

 awk '{print $--NF}' 

La raison pour laquelle l'original $NF-- n'a pas fonctionné est que l'expression est évaluée avant le décrément, alors que mon décrément préfixé est effectué avant l'évaluation.

0 votes

En tant que moyen mnémotechnique, ce comportement est le même qu'en C/Java etc. int x = ++i int x = i++, préfixe signifie incrémenter d'abord; postfixe signifie incrémenter plus tard (assignement d'abord).

0 votes

Ajoutant à cette excellente réponse, vous avez juste besoin de vérifier s'il y a plus d'un champ, sinon vous finissez par imprimer $0 (alias : toute la chaîne). Donc même modifiée, c'est toujours la réponse la plus simple : awk 'NF>1{print $--NF}'.

11voto

ghostdog74 Points 86060
awk ' { print ( $(NF-1) ) }' fichier

8voto

fedorqui Points 42938

Vous n'étiez pas loin du résultat! Voici :

awk '{NF--; print $NF}' fichier

Ceci décrémente le nombre de champs d'un, de sorte que $NF contient l'ancien pénultième.

Test

Générerons quelques nombres et les imprimerons par groupes de 5 :

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

Imprimons le pénultième sur chaque ligne :

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X