Подтвердить что ты не робот

Как получить последнее слово в каждой строке с помощью bash

Например, у меня есть файл:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

и мне нужно:

example, line, file

Я намерен использовать "awk", но проблема в том, что слова находятся в другом пространстве

4b9b3361

Ответ 1

Try

$ 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.

Ответ 2

Вы можете сделать это легко с помощью grep:

grep -oE '[^ ]+$' file

(-E используйте расширенное регулярное выражение; -o выводит только согласованный текст вместо полной строки)

Ответ 3

Вы можете сделать что-то подобное в awk:

awk '{ print $NF }'

Изменить: Чтобы избежать пустой строки:

awk 'NF{ print $NF }'

Ответ 4

Другой способ сделать это в обычном bash заключается в использовании команды rev следующим образом:

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" ","

Ответ 5

существует много способов. как показывают решения awk, это чистое решение

sed решение состоит в том, чтобы удалить что-либо до последнего пробела. Поэтому, если в конце нет места, он должен работать

sed 's/.* //g' <file>

вы также можете избежать sed и перейти на цикл while.

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

он читает строку, почитает ее, режет первый (то есть последний в оригинале) и восстанавливает назад

то же самое можно сделать чистым способом bash

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

он называется расширением параметра

Ответ 6

TL;DR;

$ 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 lobally (для всех экземпляров)

Литература: