Печать второго последнего столбца / поля в awk
Я хочу напечатать второй последний столбец или поле в awk. Количество полей переменной. Я знаю, что я должен быть в состоянии использовать $NF
но не знаете, как его можно использовать.
и это, кажется, не работает:
awk ' { print ( $NF-- ) } '
9 ответов:
небольшое дополнение к принятому ответу Криса Каннона: только печатать, если на самом деле есть второй последний столбец.
( 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) ) }' )
это проще всего:
awk '{print $--NF}'
причина оригинал
$NF--
не работает, потому что выражение вычисляется перед декрементом, в то время как мой префикс декремент выполняется перед вычислением.
вы были недалеко от результата! Это делает его:
awk '{NF--; print $NF}' file
Это уменьшает количество полей в одно, так что
$NF
содержит первый предпоследний.тест
давайте сгенерируем несколько чисел и напечатаем их на группах по 5:
$ seq 12 | xargs -n5 1 2 3 4 5 6 7 8 9 10 11 12
давайте напечатаем предпоследний на каждой строке:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}' 4 9 11
решение на Perl похожи на решение на awk Крис Каннон это:
perl -lane 'print $F[$#F-1]' file
используются следующие параметры командной строки:
n
цикл вокруг каждой строки входного файла, не печатайте автоматически каждую строку
l
удаляет новые строки перед обработкой, а затем добавляет их обратно
a
режим autosplit-разделить входные строки в@F
массив. По умолчанию разбиение на пробелы
e
выполнить код perlThe
@F
массив autosplit начинается с индекса [0], а поля awk начинаются с $1.$#F
- количество элементов в@F
вы пытались начать справа налево с помощью команды rev ? В этом случае вам просто нужно распечатать 2-й столбец:
seq 12 | xargs -n5 | rev | awk '{ print }' | rev 4 9 11