如何使用bash获取每行中的最后一个单词

时间:2013-05-17 20:02:43

标签: linux 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 个答案:

答案 0 :(得分:68)

您可以使用grep轻松完成:

grep -oE '[^ ]+$' file

-E使用扩展的正则表达式; -o仅输出匹配的文本而不是整行。

答案 1 :(得分:65)

尝试

$ 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 :(得分:21)

你可以在awk中做这样的事情:

awk '{ print $NF }'

编辑:避免空行:

awk 'NF{ print $NF }'

答案 3 :(得分:9)

在普通bash中执行此操作的另一种方法是使用rev命令,如下所示:

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

基本上,你反转文件的行,然后使用空格作为分隔符用cut拆分它们,取cut生成的第一个字段,然后再次反转令牌,使用{{ 1}}删除不需要的字符,再次tr -dtr

替换换行字符

此外,您可以通过以下方式避开第一只猫:

,

答案 4 :(得分:6)

有很多方法。正如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

它被称为参数扩展

答案 5 :(得分:5)

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 ubstitute ","", " g一起(适用于所有情况)

参考文献: