[英]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.