echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
Как я могу сделать некоторые "MAGIC" получить этот вывод ?:
three
six
nine
ОБНОВЛЕНИЕ: мне это не нужно определенным образом, мне нужно общее решение, чтобы независимо от количества столбцов в строке, например: awk всегда отображал последний столбец.
text-processing
awk
LanceBaynes
источник
источник
Ответы:
Он даже может быть сделано только с
'bash'
, без'sed'
,'awk'
или'perl'
:источник
... | while read -r line; do echo ${line##* }; done
bash
Индекс массива является предметом арифметической оценки, поэтомуecho ${line[nb - 1]}
достаточно. Как говорить оbash
, вы можете просто пропустить «NB» вещи:echo ${line[-1]}
. Более портативная альтернатива позже:echo ${line[@]: -1]}
. (См. Комментарий Стефана Чазела об отрицательных показателях в других местах.)Пытаться:
источник
ps -ef | awk '{ print $NF }'
некоторые строки были обрезаны ...) Perl не имеет такого ограничения. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : «Традиционный Awk имеет ограничение в 99 полей в записи. Поскольку некоторые реализации Awk, такие как Tru64, разделяют ввод, даже если вы не ссылаетесь в любое поле сценария, чтобы обойти эту проблему, установите 'FS' для необычного символа и используйте расщепление. ")awk
реализации имеют такое ограничение? Я никогда не видел это. Мойmawk
будет подавлен,32768
но мойgawk
иigawk
может справиться с миллионами счастливо. Даже мои занятые ящикиawk
могут справиться с миллионами. Я никогда не сталкивался с тем,awk
что не может иметь дело со 100 полями, это крошечное число, в конце концов. Вы уверены, что информация все еще актуальна? Даже на солярисе?Это проще, чем вы думаете.
источник
Попробуйте
grep
(короче / проще, но в 3 раза медленнее, чемawk
из-за использования регулярных выражений):Или
ex
(еще медленнее, но он печатает весь буфер после финиша, более полезно, когда его нужно отсортировать или отредактировать на месте):Чтобы изменить на месте, замените
-sc'%p|q!'
на-scwq
.Или
bash
:Спектакль
Учитывая сгенерированный файл 1GB через:
Я выполнил статистику времени разбора (побежал ~ 3х и взял самый низкий, протестирован на MBP OS X):
используя
awk
:используя
grep
:используя
perl
:используя
rev
+cut
:используя
ex
:используя
bash
:источник
источник
-a
автоматическое разбиение полей на@F
массивы;-l
отключает$/
(разделитель входных записей) и сохраняет его в$\
(разделитель выходных записей). Поскольку не предоставлено восьмеричное число-l
, оригинал$/
применяется в печати (окончания строк);-n
код цикла;-e
выполнить код сразу после этого. Смman perlrun
.Это также можно сделать с помощью
'sed'
:Обновить:
или проще:
источник
Или используя
cut
:хотя это не удовлетворяет требованию «общего решения». Используя
rev
дважды, мы можем решить и это:источник
rev
не работает с «широкими» символами, только однобайтовыми, насколько я знаю.Используя,
awk
вы можете сначала проверить, есть ли хотя бы один столбец.источник
awk 'NF{print $NF}'
.В Perl это можно сделать следующим образом:
выход:
Вы также можете перебрать файл, вот пример сценария, который я написал, для разбора файла с именем budget.dat
пример данных в budget.dat:
(вы можете видеть, что мне нужно захватить только «последний» столбец, а не только столбец 2)
Сценарий:
источник