Извлечь последнее слово файла в bash/sed / awk
Я хочу извлечь последнее слово файла, скажем a.txt
в bash/sed / awk.
Как я могу это сделать?
9 ответов
обновление.
если вы хотите использовать awk
и убедитесь, что есть такое слово, то так:
tac a.txt | awk 'NF{print $NF; exit}'
tac
печать файла в обратном порядке. NF
перед {}
блок заставляет его работать, когда строка не пуста. В этом случае выводится последнее поле (NF
обозначает количество полей, так что $NF
является последним), а затем выходит.
тест
$ cat a
hello my name
is blabla
and this is
my comment.
<--- note an empty line
$ tac a | awk 'NF{print $NF; exit}'
comment.
или так же, как предложено Кент!--29-->:
awk '{w=NF?$NF:w} END{print w}' file
w=$NF?$NF:w
. Это тернарный оператор: if NF>0
(без пустой строки), set w
до последнего поля. В противном случае, оставь все как есть. Наконец, в END{}
, распечатать последнее сохраненное слово.
в случае, если вы хотите сделать это с sed
, вы можете использовать это, что работает в случае, если нет пустых строк в конце:
sed -n '${s/.* //; p}' a.txt
объяснение
-
$
обозначает последнюю строку файла. В в этом случае делайте то, что внутри{}
. -
s/.* //; p
удалить все до последнего места. Тогда printp
.
попробуйте эту команду awk также,
awk -v RS="" '{print $NF}' file
RS=""
превращает все записи в файле в одну единственную запись. А потом ... --2--> печатает последнее поле этой единственной записи.
sed
вариант для поддержки пустой последней строки (если есть):
sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt
Это может сработать для вас (GNU sed):
sed -r '/\w/{s/.*\W(\w+)\W*$//;h};$!d;x;/./!d' file
сохраняет последнее слово текущей строки в пространстве удержания, затем удаляет строку. В конце файла он извлекает последнее слово и распечатывает его, если только не было слова, в этом случае он удаляет пустую строку.
альтернативный способ-проглотить весь файл в память:
sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$//p;d' file
sed -n '/^$/!{$ s/.* \(\w*\)$//p}'
это опустит пустые строки и напечатает последнее слово в последней непустой строке.
- /^$/! найти непустые строки
- $ s / в последней строке заменить
- .* (\w*)$ захватите что-нибудь между ()
- \1 Замените строку для группы захвата ()
- п печати