Я хочу надрукувати другий останній стовпчик або поле дивним способом. Кількість полів є змінною. Я знаю, що я повинен вміти користуватися, $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це значення останнього поля