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-- ) } '
awk '{print $(NF-1)}'
Devrait marcher
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) ) }'
)
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.
awk ' { print ( $(NF-1) ) }' file
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.
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
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
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
Commence par décrémenter la valeur puis l’imprimer -
awk ' { print $(--NF)}' file
OR
rev file|cut -d ' ' -f2|rev
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 }'