Как мне получить последнее слово в каждой строке с 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':substitutes","С", "gлобально (для всех экземпляры)ссылки: