我如何获得的最后一个字的使用bash每一行(How do I get the last word i

2019-09-04 03:43发布

例如我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

我需要:

example, line, file

我故意用“AWK”,但问题是这样的词语在不同的空间

Answer 1:

尝试

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


Answer 2:

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

grep -oE '[^ ]+$' file

-E使用正则表达式的扩展; -o输出的实线的唯一匹配的文本,而不是)



Answer 3:

你可以做这样的事情在AWK:

awk '{ print $NF }'

编辑:要避免空行:

awk 'NF{ print $NF }'


Answer 4:

在普通的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" ","


Answer 5:

有很多种方法。 作为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

它被称为参数扩展



Answer 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' s ubstitutes ","具有", " g lobally(所有实例)

参考文献:

  • https://linux.die.net/man/1/awk
  • https://linux.die.net/man/1/paste
  • https://linux.die.net/man/1/sed


文章来源: How do I get the last word in each line with bash
标签: linux bash