【发布时间】:2014-08-01 07:17:15
【问题描述】:
我想在 bash/sed/awk 中提取文件的最后一个字,例如 a.txt。
我该怎么做?
【问题讨论】:
我想在 bash/sed/awk 中提取文件的最后一个字,例如 a.txt。
我该怎么做?
【问题讨论】:
要获取最后一行的最后一个单词:
awk 'END {print $NF}' file
【讨论】:
已更新。
如果您想使用awk 并确保有一个单词,请使用:
tac a.txt | awk 'NF{print $NF; exit}'
tac 反向打印文件。 {} 块前面的 NF 使其在该行不为空时起作用。在这种情况下,它会打印最后一个字段(NF 代表字段数,因此$NF 是最后一个),然后退出。
$ cat a
hello my name
is blabla
and this is
my comment.
<--- note an empty line
$ tac a | awk 'NF{print $NF; exit}'
comment.
或者也如suggested by Kent:
awk '{w=NF?$NF:w} END{print w}' file
w=$NF?$NF:w。这是一个三元运算符:如果NF>0(没有空行),则将w 设置为最后一个字段。否则,保持原样。最后,在END{} 中,打印最后保存的单词。
如果你想用sed 来制作它,你可以使用它,以防最后没有空行:
sed -n '${s/.* //; p}' a.txt
$ 代表文件的最后一行。在这种情况下,请执行 {} 中的内容。s/.* //; p 删除直到最后一个空格的所有内容。然后打印p。【讨论】:
awk 'END{print $NF}' file 这样的东西,我说like,因为文件的最后一行可能是空的。既然你是第一个来的,你可以做一些修复并完成答案。
awk 'END{print $NF}' file 并不总是有效。
awk '{w=$NF?$NF:w}END{print w}' file
s/.* //; p 很好,除非行以空格结尾。我建议s/.* \([[:space:]]\{1,\}[[:space:]]*$/\1/;p 所以事件在最后一行有 1 个单词(或没有,但这取决于确切的要求)它可以工作
也试试这个 awk 命令,
awk -v RS="\0" '{print $NF}' file
RS="\0" 将文件中的所有记录转换为单个记录。然后{print $NF} 打印该单条记录的最后一个字段。
【讨论】:
你也可以使用sed命令,
$sed -nr '${s/.* (.*)$/\1/pg}' File_name
【讨论】:
p放在s///的外面,否则如果最后一行没有至少2个字就会失败,在这种情况下不需要g,只有1个每行结束。最后,它失败了,最后一个位置是一个空格字符。
使用 tail 和 grep :
tail -1 myFile.txt | grep -oE '[^ ]+$'
【讨论】:
您还可以通过grep 和tail 获得最后一个字:
<a.txt grep -o '\w\+' | tail -n1
【讨论】:
sed 变体支持空最后一行(如果有):
sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt
【讨论】:
这可能对你有用(GNU sed):
sed -r '/\w/{s/.*\W(\w+)\W*$/\1/;h};$!d;x;/./!d' file
将当前行的最后一个单词保存在保持空间中,然后删除该行。在文件末尾,它检索最后一个单词并将其打印出来,除非没有单词,在这种情况下它会删除空行。
另一种方法是将整个文件 slurp 到内存中:
sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
【讨论】:
sed -n '/^$/!{$ s/.* \(\w*\)$/\1/p}'
这将省略空行并在最后一个非空行打印最后一个单词。
【讨论】: