输入文件:
A.txt
包含:
111
222
223
344
100002
99991
B.txt
包含:
100 199 A
200 299 B
300 399 C
400 499 D
我想要这样的输出
111 A
222 B
223 B
344 C
答案1
您想要输出B.txt
由 定义的范围内的值A.txt
以及该范围的标签。
$ awk 'FNR==NR { rs[$3] = $1; re[$3] = $2; next } { for (s in rs) if ($1 >= rs[s] && $1 <= re[s]) { print $1, s; next } }' A.txt B.txt
111 A
222 B
223 B
344 C
第一个块将解析范围A.txt
并将每个范围的开始和结束保存在两个数组rs
(对于开始)和re
(对于结束)中。这些数组通过分配给文件中范围的标签进行索引。
当解析第二个文件时(将在代码的第二块中完成),我们循环遍历这些变量中的每个范围并测试数字是否落在其中之一内。如果是,则将数字与范围的标签一起输出(在代码中,标签被提取s
为“字符串”)。
上面的代码和上面的主要区别pLumo 提供的代码是我的代码会遍历每个给定输入数字的范围以找到包含该数字的范围,而他们的代码会存储每个范围的每个整数以便更快地进行查找。他们的代码在小范围内进行大量查找时会很快使用,而我的代码则以速度换取内存效率,如果您的范围很大或只需要进行少量查找,那么我的代码会更受欢迎。
答案2
尝试使用awk
:
awk '
FNR==NR{for(n=$1;n<=$2;n++)v[n]=$3}
FNR!=NR{if(v[$1])print $1,v[$1]}
' B.txt A.txt
第一行创建一个数组v
,其值是file 之间和来自 file 的$3
所有数字。$1
$2
B.txt
第二行从该数组中读取值,其数字在 中给出A.txt
。
输出:
111 A
222 B
223 B
344 C
答案3
awk -v test="$(awk '{print $1+0}' A.txt)" '{ if ($1 > test && $2 < test) {print test,$3} }' B.txt