我想将文件 1 中的数字 id 列表与两列(每行都有不同的数字/id)进行匹配
>cat file1
1 23444
3 422255223
1 35541
并仅打印较大文件 (file2) 中第一列匹配且第二列 id 位于文件 2 中的 id 之间的行。
>cat file 2
1 10 30 XP2
1 31 50 XP34
1 23000 25000 XP56
2 19000 30000 Xp9J
运行脚本,理想情况下,如果找到匹配,它将仅输出文件 1 中的 ID,然后输出列间匹配之后的任何匹配列,例如:
awk code file1 file2
1 23444 XP56
已经有一个接近这里发布的问题的解决方案: Awk - 如果数字在第 1 列和第 2 列之间,则打印行
但我正在努力修改该脚本以适应 2 列的匹配并逐行查询文件 (file1)。
答案1
这个答案是 GNU-awk 特定的:它使用数组的数组
gawk '
NR == FNR { f1[$1][$2] = 1; next }
$1 in f1 {
for (val in f1[$1]) {
if (0+$2 <= 0+val && 0+val <= 0+$3) {
print $1, val, $4
}
}
}
' file1 file2
0+x
if 条件中的业务确保将您的值作为数字而不是字符串进行比较。这是需要的,因为细绳比较,“10”<=“23444”<=“30”是真的。