Как мне получить последнее слово в каждой строке с 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 53

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лобально (для всех экземпляры)

ссылки: