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-- ) } '
9 réponses
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) ) }'
)
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.
, 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
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
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
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 }'
Décrémente D'abord la valeur, puis l'imprime -
awk ' { print $(--NF)}' file
Ou
rev file|cut -d ' ' -f2|rev