Все, що я хочу, - це надруковані дві останні колонки.
Все, що я хочу, - це надруковані дві останні колонки.
Відповіді:
Ви можете використовувати змінну, NFяка встановлена на загальну кількість полів у вхідному записі:
awk '{print $(NF-1),"\t",$NF}' file
це передбачає, що у вас є щонайменше 2 поля.
awk '{print $(NF-1) "\t" $NF}' fileабо awk '{print $(NF-1), $NF}' fileабо awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file.
'{print $x,"\t",$y}'полягає в тому, що awk інтерпретує кожну змінну комою розділену кому як її власне поле, тому результат насправді буде field1<space><tab><space>field2, (оскільки він буде використовувати роздільник білого пробілу за замовчуванням), на відміну від field1<tab>field2цього, ймовірно, що ти очікуєш використання сепаратора вихідних полів (OFS) - це майже завжди те, що ви хочете.
awk '{print $NF-1, $NF}' inputfile
Примітка. Це працює лише за наявності принаймні двох стовпців. На записах з одним стовпцем ви отримаєте помилковий"-1 column1"
echo 1 2 3 | awk .... $NF-1є ($NF) - 1в кожній awkреалізації.
yaccграматиці, що іронічно, враховуючи те, що A означає в awk. Різні версії awk розбирають речі по-різному? Великий сюрприз!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'- або будь-яким іншим входом, де друге останнє поле не менше, ніж останнє.
@jim mcnamara: спробуйте використовувати дужки навколо NF, тобто, $(NF-1)а не $(NF)замість $NF-1і $NF(працює на Mac OS X 10.6.8 для FreeBSD awkі gawk).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)- що принаймні є більш портативним, ніж $NF-1; це, безумовно, менш неоднозначно. $(NF)все-таки зайвий - просто $NFзроблять. Захист від рядків, що мають менше 2 стовпців, також вартий, тому що для рядків з одним стовпцем ви отримаєте значення першого стовпця вдвічі , а з нульовим стовпцем, тобто порожнім рядком, команда awk взагалі не зможе внаслідок спроби для доступу до поля з індексом -1.
Використання gawk демонструє проблему:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Я щойно ставлю гаук на Solaris 10 M4000: Отже, gawk є супротивником у випуску $ NF-1 проти $ (NF-1). Наступне питання, що говорить POSIX? за:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Немає напряму в той чи інший бік. Не добре. gawk передбачає віднімання, інші awks означають число поля або віднімання. хм.
$(NF-1)полягає в тому, що обидва приклади обчислення індексу поля в специфікації використовують таку форму: $(NF-1)і $(NF+2). Тоді є розділ "Вирази у курсі", в якому вказано $expr, що має [набагато] перевагу вище expr - expr. Оскільки NFце само вираження, $NF-1слід оцінювати ($NF)-1. Навіть якщо, зрештою, там дійсно є дивовижні реалізації, які оцінюють $NF-1як $(NF-1), уроки, засвоєні тут, - це те, що використання $(NF-1)- це безпечний і портативний вибір.
спробуйте з цим
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Спробуйте це, щоб врахувати всі можливі сценарії:
awk '{print $(NF-1)"\t"$NF}' file
або
awk 'BEGIN{OFS="\t"}' file
або
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file