如何在awk脚本中调用cutoff1文件中存储的数值?
解决awk脚本调用外部文件数值的问题
我来帮你搞定这个问题~你之前的写法主要有两个问题:一是shell命令替换的语法不对(单引号里的cat cutoff1不会被shell执行,会被当成字符串),二是if语句的括号不完整。下面给你两种靠谱的解决方案:
方法一:用-v选项给awk传递变量
这是最直观的方式,先通过shell命令替换读取cutoff1的内容,再用awk的-v选项把这个值定义为awk内部变量:
awk -v cutoff=$(cat cutoff1) '{ if ($1 >= cutoff) print $1 }' hist1.dat > hist_oc1.dat
原理说明:
$(cat cutoff1)会先被shell执行,得到cutoff1里的0.34722-v cutoff=...把这个值赋值给awk的变量cutoff,之后在awk脚本里就能直接用这个变量做判断了- 同时修正了if语句的语法:
if ($1 >= cutoff)需要用括号包裹条件
方法二:让awk直接读取cutoff1文件
如果不想依赖shell的命令替换,可以让awk自己读取cutoff1的内容,再处理目标文件:
awk 'NR==FNR{cutoff=$1; next} $1 >= cutoff{print $1}' cutoff1 hist1.dat > hist_oc1.dat
原理说明:
- awk会按顺序处理命令行里的文件:先处理
cutoff1,再处理hist1.dat NR==FNR是awk的经典用法:NR是所有文件的总记录数,FNR是当前文件的记录数,处理第一个文件时两者相等,此时把cutoff1的第一列值存到cutoff变量,用next跳过后续操作- 处理
hist1.dat时,直接用之前存好的cutoff变量做判断,符合条件就打印第一列
这两种方法都能完美替代你手动写数值的方式,而且更灵活,以后cutoff1里的数值变化了,脚本不用改就能直接用~
内容的提问来源于stack exchange,提问作者Soumendranath Bhakat
相关产品推荐
相关产品推荐

