Например, у меня есть файл:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
и мне нужно:
example, line, file
Я намерен использовать "awk", но проблема в том, что слова находятся в другом пространстве
Например, у меня есть файл:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
и мне нужно:
example, line, file
Я намерен использовать "awk", но проблема в том, что слова находятся в другом пространстве
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.
Вы можете сделать это легко с помощью grep:
grep -oE '[^ ]+$' file
(-E
используйте расширенное регулярное выражение; -o
выводит только согласованный текст вместо полной строки)
Вы можете сделать что-то подобное в awk:
awk '{ print $NF }'
Изменить: Чтобы избежать пустой строки:
awk 'NF{ print $NF }'
Другой способ сделать это в обычном 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" ","
существует много способов. как показывают решения 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
он называется расширением параметра
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 (для всех экземпляров)Литература: