提取bash/sed/awk中文件的最后一个字

提取bash/sed/awk中文件的最后一个字,bash,file,awk,sed,Bash,File,Awk,Sed,我想在bash/sed/awk中提取文件的最后一个字,比如a.txt 我该怎么做?已更新 如果要使用awk并确保有单词,请使用以下命令: tac a.txt | awk 'NF{print $NF; exit}' tac反向打印文件NF使其工作。在这种情况下,它打印最后一个字段(NF表示字段数,因此$NF是最后一个),然后退出 试验 w=$NF?$NF:w。这是一个三元运算符:如果NF>0(无空行),则将w设置为最后一个字段。否则,保持原样。最后,在END{}中,打印最后保存的单词 如果要使

我想在bash/sed/awk中提取文件的最后一个字,比如
a.txt

我该怎么做?

已更新

如果要使用
awk
并确保有单词,请使用以下命令:

tac a.txt | awk 'NF{print $NF; exit}'
tac
反向打印文件<当行不为空时,
{}
块前面的code>NF使其工作。在这种情况下,它打印最后一个字段(
NF
表示字段数,因此
$NF
是最后一个),然后退出

试验
w=$NF?$NF:w
。这是一个三元运算符:如果
NF>0
(无空行),则将
w
设置为最后一个字段。否则,保持原样。最后,在
END{}
中,打印最后保存的单词


如果要使用
sed
,可以使用此选项,以防末尾没有空行:

sed -n '${s/.* //; p}' a.txt
解释
  • $
    代表文件的最后一行。在这种情况下,执行
    {}
    中的操作
  • s/*/;p
    删除所有内容直到最后一个空格。然后打印
    p

要在最后一行中说出最后一个字:

awk 'END {print $NF}' file

也可以尝试此awk命令

awk -v RS="\0" '{print $NF}' file

RS=“\0”
将文件中的所有记录转换为单个记录。然后,
{print$NF}
打印单个记录的最后一个字段。

您也可以使用sed命令

$sed -nr '${s/.* (.*)$/\1/pg}' File_name

您还可以使用
grep
tail
获取最后一个单词:

<a.txt grep -o '\w\+' | tail -n1
使用tail和grep:

tail -1 myFile.txt | grep -oE '[^ ]+$'

sed
支持空最后一行的变体(如果有):

这可能适用于您(GNU-sed):

将当前行的最后一个字保存在保留空间中,然后删除该行。在文件末尾,它检索最后一个单词并将其打印出来,除非没有单词,否则会删除空行

另一种方法是将整个文件读入内存:

sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
这将省略空行,并在最后一个非空行上打印最后一个单词

  • /^$/!查找非空行
  • $s/在最后一行替换
  • .*(\w*)$捕获()
  • \1个捕获组的替换行()
  • p打印出来

我猜他想要类似于
awk'END{print$NF}文件的东西
我说喜欢,因为文件的最后一行可能是空的。既然你是第一位,你可以做一些修正并完成答案。呃,没错,我理解错了。Jotne现在发布了他的答案,所以我将删除我的答案。正如我所评论的,
awk'END{print$NF}文件
并不总是有效。+1因为OP说没有空行,所以更简单,我只想注释
awk'{w=$NF?$NF:w}结束{print w}文件
s/*/;p
可以,除非行尾有空格。mya我建议
s/*\([[:space:]\{1,\}[:space:]*$/\1/;p
so事件中有一行字(或没有,但这取决于确切的请求)在最后一行,它可以工作。你应该把
p
放在
s//
旁边,否则如果最后一行上没有至少2个单词,并且不需要
g
,那么它就会失败。在这种情况下,每行只有1个结束。最后一行失败,最后一个位置是一个空格字符。
tail -1 myFile.txt | grep -oE '[^ ]+$'
sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt
sed -r '/\w/{s/.*\W(\w+)\W*$/\1/;h};$!d;x;/./!d' file
sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
 sed -n '/^$/!{$ s/.* \(\w*\)$/\1/p}'