Как мне получить последнее слово в каждой строке с bash
например у меня есть файл:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
и мне надо:
example, line, file
Я намереваюсь с "awk", но проблема в том, что слова находятся в другом пространстве
6 ответов:
попробовать
$ awk 'NF>1{print $NF}' file example. line. file.
чтобы получить результат в одной строке, как в вашем примере, попробуйте:
{ sub(/\./, ",", $NF) str = str$NF } END { print str }
выход:
$ awk -f script.awk file example, line, file,
Pure bash:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file example. line. file.
вы можете сделать это легко с grep:
grep -oE '[^ ]+$' file
(
-E
использовать расширенное регулярное выражение;-o
выводить только совпадающий текст вместо полной строки)
вы можете сделать что-то вроде этого в awk:
awk '{ print $NF }'
изменить: чтобы избежать пустой строки:
awk 'NF{ print $NF }'
другой способ сделать это в простой bash является использование такой:
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
в основном, вы переворачиваете строки файла, а затем разделяете их с помощью
cut
используя пробел в качестве разделителя, возьмите первое поле, котороеcut
производит, а затем вы снова меняете токен, используйтеtr -d
для удаления нежелательных символов иtr
снова заменить символы новой строки на,
кроме того, вы можете избежать первого кота, выполнив:
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
есть много способов. как
awk
решения показывает, это чистое решениеsed решение состоит в том, чтобы удалить что-либо до последнего места. Так что если нет места в конце, он должен работать
sed 's/.* //g' <file>
вы можете избежать
sed
также и пойти наwhile
петли.while read line do [ -z "$line" ] && continue ; echo $line|rev|cut -f1 -d' '|rev done < file
он читает строку, почитает ее, вырезает первую (т. е. последнюю в оригинале) и восстанавливает обратно
то же самое можно сделать в чистом Баш путь
while read line do [ -z "$line" ] && continue ; echo ${line##* } done < file
это называется расширением параметра
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
для такого файла
$ cat file.txt The quick brown fox jumps over the lazy dog.
данная команда выведет
fox, over, dog.
как работает:
awk '{print $NF}'
: выводит последнее поле каждой строкиpaste -sd,
: читаетstdin
серийно (-s
, по одному файлу за раз) и записывает поля через запятую (-d,
)sed 's/,/, /g'
:s
ubstitutes","
С", "
g
лобально (для всех экземпляры)ссылки: