如何提取文件最后一行整数作为变量传入awk命令参与运算
问题原因
- 你执行报错的核心原因是
tail -n1 file.txt返回的99前置带空白字符,未加引号的变量$div在shell展开时会把空格当成参数分隔符,原命令会被展开为awk -v a= 99 '{print $2/a}' conf.txt,awk会误将99识别为输入文件名、后续的打印脚本识别为第二个文件名,因此抛出找不到文件的错误。 - 直接手动定义
num=99时没有额外空白,所以展开后参数结构正常,运行无问题。
最优解决方案(无中间变量,单次awk调用完成)
不用额外调用tail、不用定义中间变量,直接用awk同时处理两个文件即可,命令如下:
awk 'NR == FNR { last = $0; next } { print $2 / last }' file.txt conf.txt
命令说明:
NR == FNR:全局行号等于当前文件行号时,代表正在处理第一个输入文件file.txt,此时每次更新last变量为当前行内容,直到读完file.txt,last自然就是file.txt的最后一行内容next:读完file.txt的行后直接跳至下一行,不执行后续逻辑- 处理第二个文件
conf.txt时,直接用第二列除以last变量即可,awk会自动忽略last里的空白字符,自动转为数值参与计算
原有写法的修复方案
如果你坚持要先用tail提取数值,只需对变量加引号避免shell展开错误即可:
# 方法1:给变量加双引号 div=$(tail -n1 file.txt) awk -v a="$div" '{print $2/a}' conf.txt # 方法2:提取时直接去除所有空白字符 div=$(tail -n1 file.txt | tr -d '[:space:]') awk -v a=$div '{print $2/a}' conf.txt
内容的提问来源于stack exchange,提问作者user95146
相关产品推荐
相关产品推荐

