我有一个存储在名为cutoff1
如果我cat cutoff1
看起来像
0.34722
我想在awk脚本中使用cutoff1中存储的值。像下面这样的东西
awk '{ if ($1 >= 'cat cutoff1' print $1 }' hist1.dat >hist_oc1.dat
我想我犯了一些错误。如果我手动操作,它将看起来像
awk '{ if ($1 >= 0.34722) print $1 }' hist1.dat >hist_oc1.dat
如何在上面提到的awk
脚本中使用cutoff1文件中存储的值?
答案 0 :(得分:2)
实现这一目标的最简单方法是
awk -v cutoff="$(cat cutoff1)" '($1 >= cutoff){print $1}' hist.dat
awk -v cutoff="$(< cutoff1)" '($1 >= cutoff){print $1}' hist.dat
或
awk '(NR==FNR){cutoff=$1;next}($1 >= cutoff){print $1}' cutoff1 hist.dat
或
awk '($1 >= cutoff){print $1}' cutoff="$(cat cutoff1)" hist.dat
awk '($1 >= cutoff){print $1}' cutoff="$(< cutoff1)" hist.dat
注意:感谢Glenn Jackman指出:
man bash
命令替换: Bash通过执行命令并用命令替换命令替换来执行扩展 命令的标准输出,删除任何尾随换行符。 嵌入的换行符不会被删除,但可能会在word中删除 分裂。命令替换$(cat file)
可以替换为 相当但更快$(< file)
。
答案 1 :(得分:2)
因为awk可以读取多个文件,只需在数据文件之前添加文件名并特别处理第一行。无需外部变量声明。
awk 'NR==1{cutoff=$1; next} $1>=cutoff{print $1}' cutoff data
PS 刚刚注意到它与@ kvantour的第二个答案类似,但在此处保留它作为一种不同的风格。
答案 2 :(得分:0)
您可以在方便时使用getline
从其他文件中读取值。首先要处理的主要文件:
$ cat > file
wait
wait
did you see that
nothing more to see here
cutoff
:
$ cat cutoff
0.34722
一个wwk脚本,当它遇到记录中的字符串cutoff
时从see
读取一行:
$ awk '/see/{if((getline val < "cutoff") > 0) print val}1' file
wait
wait
0.34722
did you see that
nothing more to see here
说明:
$ awk '
/see/ { # when string see is in the line
if((getline val < "cutoff") > 0) # read a value from cutoff if there are any available
print val # and output the value from cutoff
}1' file # output records from file
由于只有一个值,即使see
被发现两次,也只打印一次。