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

cam*_*oto 68 linux bash

例如,我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.
Run Code Online (Sandbox Code Playgroud)

我需要:

example, line, file
Run Code Online (Sandbox Code Playgroud)

我的意图是"awk",但问题是这些单词在不同的空间

ric*_*ici 77

你可以用grep轻松完成:

grep -oE '[^ ]+$' file
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个最好的=] (4认同)
  • 它应该是`grep -oE'[^] + $'`,由于浏览器的行为,您希望在此处看到选项卡,但是无论如何,这也要考虑选项卡空间,或者更好的是,您可以执行`grep -oE'[^ [:space:]] + $'` (2认同)

Fre*_*ihl 74

尝试

$ awk 'NF>1{print $NF}' file
example.
line.
file.
Run Code Online (Sandbox Code Playgroud)

要在示例中将结果放在一行中,请尝试:

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }
Run Code Online (Sandbox Code Playgroud)

输出:

$ awk -f script.awk file
example, line, file, 
Run Code Online (Sandbox Code Playgroud)

纯粹的bash:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
Run Code Online (Sandbox Code Playgroud)


Hal*_*ary 26

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

awk '{ print $NF }'
Run Code Online (Sandbox Code Playgroud)

编辑:避免空行:

awk 'NF{ print $NF }'
Run Code Online (Sandbox Code Playgroud)


hig*_*aro 10

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

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
Run Code Online (Sandbox Code Playgroud)

基本上,您反转文件的行,然后cut使用空格作为分隔符拆分它们,取出cut生成的第一个字段,然后再次反转令牌,用于tr -d删除不需要的字符,然后tr再次替换新行字符,

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

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
Run Code Online (Sandbox Code Playgroud)


aba*_*asu 6

有很多方法.正如awk解决方案所示,这是一个干净的解决方案

sed解决方案是删除任何东西,直到最后一个空格.因此,如果最后没有空间,它应该工作

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

你也可以避免sedwhile循环.

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file
Run Code Online (Sandbox Code Playgroud)

它读取一条线,尊重它,切割第一条线(即原始线中的最后一条线)并恢复原状

同样可以用纯粹的bash方式完成

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file
Run Code Online (Sandbox Code Playgroud)

它被称为参数扩展


rub*_*cks 5

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
Run Code Online (Sandbox Code Playgroud)

对于像这样的文件

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.
Run Code Online (Sandbox Code Playgroud)

给定的命令将打印

fox, over, dog.
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • awk '{print $NF}' :打印每行的最后一个字段
  • paste -sd,:stdin串行读取(-s,一次读取一个文件)并写入逗号分隔的字段(-d,)
  • sed 's/,/, /g':substitutes ","", " globally(所有实例)

参考文献: