我如何用bash获得每一行的最后一个单词


79

例如我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

我需要:

example, line, file

我打算使用“ awk”,但问题是单词在不同的空间


1
由于空行,您的“第二行”不在第二行,请在以后提供较少歧义的示例。
2013年

Answers:


91

尝试

$ 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, 

纯重击:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.

@Fredrik Pihl,您能否在每个代码部分中添加说明,例如:“此代码通过打印来打印awk接收的最后一个字段$NF”?
Alexej Magura

你能解释一下echo $ {line ## *};
code4cause导致

1
@ code4cause-只需转到gnu.org/software/bash/manual/bash.html##在外壳中搜索或尝试即可。
Fredrik Pihl

如果只有一个单词,则不返回任何内容。$ echo“ foo” | awk'NF> 1 {print $ NF}'$
Ethan Post

85

您可以使用grep轻松做到这一点:

grep -oE '[^ ]+$' file

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


3
应该是grep -oE '[^ ]+$',由于浏览器的行为,您希望在此处看到选项卡,但是无论如何,这也应考虑选项卡空间,或者更好的是,您可以这样做grep -oE '[^[:space:]]+$'
Nabil Kadimi


12

在纯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" ","

这是一个简单得多的解决方案!我很欣赏这个想法!
Sohail Saha

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

它读取一行,对其进行崇敬,剪下第一行(即原始行中的最后一行)并还原

可以用纯重的方式完成同样的操作

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

称为参数扩展


6

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'substitutes","", " globally(所有实例)

参考文献:


尽管此代码可以回答问题,但提供了有关原因和/或其他上下文的信息此代码如何将显着提高其长期价值。请编辑您的答案以添加一些说明。
Toby Speight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.