如何根据文件2中的某些数字范围,使文件1中的awk与文件2中的行匹配

时间:2017-03-07 18:20:42

标签: linux awk scripting

我有以下两个文件:

文件1:

22
2
42
32

文件2:

1 10 valuea
11 20 valueb
21 30 valuec
31 40 valued
41 50 valuee
51 60 valuef

如何让awk从文件1中获取每个值,根据它是否落在文件2的第1列和第2列中的数字范围之间,将其与文件2匹配,然后从匹配列中打印出第3列文件2?输出类似于以下内容:

valuec
valuea
valuee
valued

我尝试使用以下AWK命令(基于我在这篇文章中找到的内容:How to check value of a column lies between values of two columns in other file and print corresponding value from column in Unix?),但它似乎无法正常工作。

#!/bin/bash
awk 'FNR == NR { val[$1] = $1 }
     FNR != NR { if (val[$1] >= $1 && val[$1] <= $2)
                     print $3
               }' file1 file2

此外,由于显而易见的原因,我没有将其包含在此处,但是对于此脚本的实际应用,文件1将包含大约7,000个条目,而文件2将包括68,000个条目

1 个答案:

答案 0 :(得分:1)

替代awk脚本

$ awk 'FNR == NR {a[$1]=$2; v[$1]=$3; next} 
                 {for(k in a) 
                      if(k+0<=$1 && $1+0<=a[k]) print v[k]}' file2 file1

valuec
valuea
valuee
valued

请注意,file2是第一个文件。这也将涵盖多个范围匹配。 +0是强制进行数字比较。