繁体   English   中英

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

[英]How do I get the last word in each line with 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, 

纯重击:

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

您可以使用 grep 轻松完成:

grep -oE '[^ ]+$' file

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

您可以在 awk 中执行以下操作:

awk '{ print $NF }'

编辑:为了避免空行:

awk 'NF{ print $NF }'

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

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 g替换","", "全局(适用于所有实例)

参考:

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

称为参数扩展

如果你想为最后一个词启动一个 perl 单行:

perl -lane 'print "$F[-1]"'

...其中-a将自动拆分为@F$F[-1]是最后一个元素。

用逗号变成列表:

perl -ane 'print "$F[-1]" . (eof() ? "\n":",")'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM