Je veux imprimer l'avant-dernière colonne ou champ dans awk. Le nombre de champs est variable. Je sais que je devrais pouvoir utiliser $NF
mais je ne sais pas comment il peut être utilisé.
Et cela ne semble pas fonctionner:
awk ' { print ( $NF-- ) } '
NF
est le dernier index de champ,$NF
est la valeur du dernier champRéponses:
Devrait marcher
la source
awk -F '.' '{print $(NF-2)}'
$(..)
appelle une commande dans un sous-shell en fonction du shell que vous utilisez. Vous pouvez contourner ce problème en utilisant$ (NF-1)
au lieu de$(NF-1)
.Petit ajout à la réponse acceptée de Chris Kannon: n'imprimez que s'il y a réellement une avant-dernière colonne.
la source
C'est le plus simple:
La raison pour laquelle l'original
$NF--
n'a pas fonctionné est que l'expression est évaluée avant la décrémentation, alors que ma décrémentation de préfixe est effectuée avant l'évaluation.la source
int x = ++i
int x = i++
, le préfixe signifie incrémenter d'abord; postfix signifie incrémenter plus tard (affectation en premier).la source
Vous n'étiez pas loin du résultat! Cela le fait:
Cela décrémente le nombre de champs dans un, de sorte qu'il
$NF
contient l'avant-dernier précédent.Tester
Générons des nombres et imprimons-les sur des groupes de 5:
Imprimons l'avant-dernier sur chaque ligne:
la source
Solution Perl similaire à la solution awk de Chris Kannon:
Ces options de ligne de commande sont utilisées:
n
boucle autour de chaque ligne du fichier d'entrée, n'imprime pas automatiquement chaque lignel
supprime les nouvelles lignes avant le traitement et les rajoute par la suitea
mode autosplit - divise les lignes d'entrée dans le@F
tableau. Par défaut, diviser sur les espacese
exécuter le code perlLe
@F
tableau autosplit commence à l'index [0] tandis que les champs awk commencent par $ 1.$#F
est le nombre d'éléments dans@F
la source
$F[-2]
Avez-vous essayé de démarrer de droite à gauche en utilisant la commande rev? Dans ce cas, il vous suffit d'imprimer la 2ème colonne:
la source
Décrémente d'abord la valeur, puis l'imprime -
OU
la source
Si vous avez de nombreuses colonnes et que vous souhaitez imprimer toutes les pages, mais pas les trois cloumns de la dernière, cela peut aider
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
la source