如何在bash的每一行中得到最后一个单词
例如,我有一个文件:
$ cat file i am the first example. i am the second line. i do a question about a file.
我需要:
example, line, file
我意图与“awk”,但问题是,这些词是在不同的空间
尝试
$ 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,
纯粹的bash:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file example. line. file.
你可以用grep轻松做到这一点:
grep -oE '[^ ]+$' file
( -E
使用扩展正则expression式; -o
只输出匹配的文本而不是整行)
你可以在awk中做这样的事情:
awk '{ print $NF }'
编辑:避免空行:
awk 'NF{ print $NF }'
在纯bash中这样做的另一种方法是使用rev
命令,如下所示:
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
基本上,你反转文件的行,然后用空格作为分隔符分割它们,把第一个cut
产生的字段再次反转,使用tr -d
删除不需要的字符并再次replace换行符chars与,
另外,你可以通过这样做来避免第一只猫:
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
有很多方法。 正如awk
解决scheme所显示的,这是一个干净的解决scheme
sed解决scheme是删除任何东西,直到最后一个空格。 所以如果最后没有空间的话,它应该可以工作
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
它被称为参数扩展
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","
with", "
g
lobally(for all instances)
参考文献: