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

标签 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 个条目

最佳答案

替代 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 强制进行数值比较。

关于linux - 如何根据文件 2 中的某些数字范围使 awk 将文件 1 中的行与文件 2 中的行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655506/

相关文章:

python - 是什么让 Python 成为一种优秀的脚本语言?

sql - 如何在postgresql中删除一个表

linux - NULL指针在linux系统上是如何实现的?

bash - 基本的shell编程

c++ - 有属性问题的对象工厂?

sql-server - 在 SQL Server 中,如何为给定表生成 CREATE TABLE 语句?

linux - 是否有包含 java 的 flatpak 运行时?

c++ - 当在头文件而不是 CPP 文件上实现时,析构函数会导致内存泄漏 - 仅在 linux 上

Unix - 需要剪切具有多个空格作为分隔符的文件 - awk 还是 cut?

bash - 如何将语法突出显示添加到 make 错误消息中?