Я хочу надрукувати другий останній стовпчик або поле дивним способом. Кількість полів є змінною. Я знаю, що я повинен вміти користуватися, $NF
але не знаю, як це можна використовувати.
І це, здається, не працює:
awk ' { print ( $NF-- ) } '
Я хочу надрукувати другий останній стовпчик або поле дивним способом. Кількість полів є змінною. Я знаю, що я повинен вміти користуватися, $NF
але не знаю, як це можна використовувати.
І це, здається, не працює:
awk ' { print ( $NF-- ) } '
Відповіді:
awk '{print $(NF-1)}'
Треба працювати
awk -F '.' '{print $(NF-2)}'
$(..)
викликає команду в нижній частині, залежно від оболонки, яку ви використовуєте. Ви можете обійти це, використовуючи $ (NF-1)
замість цього $(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--
не спрацювала, полягає в тому, що вираз оцінюється перед декрементом, тоді як мій префікс виконується перед оцінкою.
int x = ++i
int x = i++
Префікс означає приріст спочатку; postfix означає приріст пізніше (присвоєння спочатку).
Ви не були далеко від результату! Це робить це:
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, аналогічне дивним рішенням Кріса Каннона:
perl -lane 'print $F[$#F-1]' file
Ці параметри командного рядка використовуються:
n
циклічно навколо кожного рядка вхідного файлу, не друкуйте кожен рядок автоматично
l
видаляє нові рядки перед обробкою та додає їх згодом
a
режим автоспліт - розділити вхідні лінії в @F
масив. За замовчуванням розділяється на пробіл
e
виконати код Perl
@F
Масив AutoSplit починається з індексу [0] в той час як поля AWK почати з $ 1.
$#F
- кількість елементів у@F
$F[-2]
Спочатку зменшується значення, а потім надрукується -
awk ' { print $(--NF)}' file
АБО
rev file|cut -d ' ' -f2|rev
NF
є останнім індексом поля,$NF
це значення останнього поля