使用存储在不同文件awk中的值

时间:2018-04-25 15:22:42

标签: bash awk

我有一个存储在名为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文件中存储的值?

3 个答案:

答案 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被发现两次,也只打印一次。