如何在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)

参考文献: