web-dev-qa-db-fra.com

Imprimer seconde dernière colonne / champ dans awk

Je veux imprimer l'avant dernière colonne ou le champ dans awk. Le nombre de champs est variable. Je sais que je devrais pouvoir utiliser $NF mais je ne sais pas comment l'utiliser.

Et cela ne semble pas fonctionner:

awk ' { print ( $NF-- )  } '
152
Brian G
awk '{print $(NF-1)}'

Devrait marcher

258
Chris Kannon

Petit ajout à la réponse acceptée de Chris Kannon: n'imprimez que s'il existe une 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) ) }'
)
21
progz

C'est le plus simple:

 awk '{print $--NF}' 

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

13
Steve
awk ' { print ( $(NF-1) ) }' file
9
ghostdog74

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

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

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

Tester

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

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

Imprimons l'avant dernière sur chaque ligne:

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

Solution Perl similaire à la solution awk de Chris Kannon:

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

Ces options de ligne de commande sont utilisées:

  • 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 rajoute après

  • a mode autosplit - divise les lignes d'entrée en @F tableau. Fractionnement par défaut des espaces

  • e exécute le code Perl

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

3
Chris Koknat

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

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
2
Fdv

Commence par décrémenter la valeur puis l’imprimer -

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

OR

rev file|cut -d ' ' -f2|rev
1
VIPIN KUMAR

Si vous avez plusieurs colonnes et que vous souhaitez imprimer toutes les colonnes, mais pas les trois dernières, cela pourrait aider.

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

0
Sand1512