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

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

И это не работает:

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

Ответ 1

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

Должен работать

Ответ 2

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

(
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) ) }'
)

Ответ 3

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

Ответ 4

Проще всего:

 awk '{print $--NF}' 

Причина, по которой исходный $NF-- не работал, заключается в том, что выражение оценивается до декремента, тогда как мой префиксный декремент выполняется перед оценкой.

Ответ 5

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

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

Это уменьшает количество полей в одном, так что $NF содержит первое предпоследнее.

Test

Пусть генерируют некоторые числа и печатают их по группам из 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

Ответ 6

Решение Perl аналогично решению Chris Kannon awk:

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

Эти параметры командной строки используются:

  • n перемещаться по каждой строке входного файла, не печатать автоматически каждую строку

  • l удаляет символы новой строки перед обработкой и добавляет их обратно

  • a режим автосброса - разделение входных строк на массив @F. По умолчанию разделение на пробелы

  • e выполнить код perl

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

Ответ 7

Вы пытались запустить справа налево, используя команду rev? В этом случае вам просто нужно напечатать второй столбец:

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

Ответ 8

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

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

Ответ 9

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

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

ИЛИ

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