我有一个名为sample.txt
的文件,文件中的值是这样的:
编者注:样本行最初在它们之间有空行,但OP已确认这是偶然的。
100
200
300
hiiiii
最后一个值可以是字符串或除数字之外的任何内容....
如何使用unix脚本从文件中获取最后一个整数值。我期待的输出是300 ..
我尝试了以下命令,但我只从 hiiiii 获取
value=`cat $working_tmp_dir/sample.txt|tail -3| head -1|cut -f2 -d'='|cut -b 1-8`
答案 0 :(得分:2)
grep -Eo '^[0-9]+$' hi.txt | tail -1
其中hi.txt是您的文件
答案 1 :(得分:2)
awk
也适用于此:
awk '{ if ($1 ~ /^[0-9]+$/) lastnumber=$1 } END {print lastnumber}' <yourfile.txt>
awk
将遍历您文件中的每一行,并通过此处单引号内的脚本运行它。
脚本,用外行人的术语说&#34;测试该行的第一个字段($ 1)以查看它是否与此正则表达式匹配,该正则表达式正在查找仅为数字的字符串。如果找到匹配项,则将该匹配项存储在变量lastnumber
中。当awk向下移动文件时,它会在第一个字段中找到完全数字字符串时更改lastnumber
。完成(END
)处理文件后,它会打印存储在lastnumber
变量中的值。
话虽如此,如果您的系统支持tac
,我会推荐@ karakfa的答案,因为这对于较大的文件会更有效。
我还强烈建议阅读@ mklement0的优秀答案,因为它使用相同的逻辑,但适用于整个文件行,并且是一个更简洁的脚本。他们的解释也非常好。
答案 2 :(得分:2)
另一种选择
$ tac file | awk '/^[0-9]+$/{print;exit}'
300
反转文件,打印第一个数字。
答案 3 :(得分:1)
你可以使用带有grep
(PCRE)的 GNU -P
命令和-z
选项一次读取整个文件:
grep -oPz '\d+(?=\D*\z)' file
300
答案 4 :(得分:1)
假设你的整数:
您可以使用这种高效的单命令解决方案(符合POSIX):
awk '/^[0-9]+$/ { n=$0; next } { print n; exit }' sample.txt
注意:尽管karakfa's answer涉及一个额外的实用程序tac
,但对于最后一个数字接近文件末尾的大文件,他的答案可能会更快。
/^[0-9]+$/
仅匹配由十进制数字组成的行,即十进制数字(可能带有前导零)。{ n=$0; next }
将该行($0
)保存在变量n
中并开始处理下一行(next
;跳过脚本中的其余命令)。{ print n; exit }
首先执行 not 仅包含十进制数字的第一行; n
,其中包含遇到的 last 十进制数,并且exit
完全终止处理。答案 5 :(得分:0)
这将匹配文件中的数字并打印最后一个。
grep -o "[0-9]*" sample.txt | tail -n 1
答案 6 :(得分:0)
另一种选择
grep -x '[0-9 ]*' hi.txt | tail -1
(我决定也允许空格)