Печать второго последнего столбца / поля в awk


Я хочу напечатать второй последний столбец или поле в awk. Количество полей переменной. Я знаю, что я должен быть в состоянии использовать $NF но не знаете, как его можно использовать.

и это, кажется, не работает:

awk ' { print ( $NF-- )  } '
9 141

9 ответов:

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

должно работать

небольшое дополнение к принятому ответу Криса Каннона: только печатать, если на самом деле есть второй последний столбец.

(
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 ' { print ( $(NF-1) ) }' file

вы были недалеко от результата! Это делает его:

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 выполнить код perl

The @F массив autosplit начинается с индекса [0], а поля awk начинаются с $1.
$#F - количество элементов в @F

вы пытались начать справа налево с помощью команды rev ? В этом случае вам просто нужно распечатать 2-й столбец:

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

Если у вас много столбцов и вы хотите напечатать все, но не три облака в последнем, то это может помочь

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

сначала уменьшает значение, а затем распечатать его -

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

или

rev file|cut -d ' ' -f2|rev