Imprimer l'avant-dernière colonne / champ dans awk

Je veux imprimer l'avant-dernière colonne ou champ dans awk. Le nombre de champs est variable. Je sais que je devrais être capable d'utiliser $NF mais je ne sais pas comment il peut être utilisé.

Et cela ne semble pas fonctionner:

awk ' { print ( $NF-- )  } '
141
demandé sur codeforester 2010-01-19 22:38:38

9 réponses

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

Devrait fonctionner

229
répondu Chris Kannon 2014-07-30 08:19:37

Petit ajout à la réponse acceptée de Chris Kannon: n'imprimer que s'il y a réellement 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) ) }'
)
18
répondu progz 2013-03-18 11:45:07

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 de préfixe est effectué avant l'évaluation.

12
répondu Steve 2015-05-21 11:34:16
awk ' { print ( $(NF-1) ) }' file
9
répondu ghostdog74 2014-07-30 08:24:13

, Vous n'étiez pas loin du résultat! Cela le fait:

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

Cela décrémente le nombre de champs dans un, de sorte que $NF contient l'avant-dernier.

Essai

Générons quelques nombres et imprimons-les sur les groupes de 5:

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

Imprimons l'avant-dernier sur chaque ligne:

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
4
répondu fedorqui 2014-11-21 14:47:36

Solution Perl similaire à la solution awk de Chris Kannon:

perl -lane 'print $F[$#F-1]' file

Ces options de ligne de commande sont utilisés:

  • n boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement chaque ligne

  • l supprime les nouvelles lignes avant le traitement, et les ajoute ensuite

  • a mode autosplit-diviser les lignes d'entrée dans le tableau @F. Par défaut, fractionner sur les espaces

  • e exécuter l' code perl

Le tableau @F autosplit commence à index [0] tandis que les champs awk commencent par $1.
$#F est le nombre d'éléments dans @F

3
répondu Chris Koknat 2015-09-16 15:55:23

Avez-vous essayé de commencer de droite à gauche en utilisant la commande rev ? Dans ce cas, il vous suffit d'imprimer la 2ème colonne:

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
2
répondu Fdv 2016-06-18 13:10:11

Si vous avez beaucoup de colonnes et que vous voulez imprimer toutes mais pas les trois cloumns dans la dernière, cela peut aider

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

0
répondu san1512 2015-07-15 20:40:59

Décrémente D'abord la valeur, puis l'imprime -

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

Ou

rev file|cut -d ' ' -f2|rev
0
répondu VIPIN KUMAR 2016-10-11 14:33:47