根据第二个文件中的特定值选择一个文件中的行(Linux)

时间:2016-09-08 21:27:04

标签: linux

我有两个文件:

一个是“total.txt”。它有两列:第一列是自然数(指标),范围从1到20,第二列包含随机数。

1 321
1 423
1 2342
1 7542
2 789
2 809
2 5332
2 6762
2 8976
3 42
3 545
... ...
20 432
20 758

另一个是“index.txt”。它有三列:(1.indicator,2:低值,3:高值)

1 400 5000
2 600 800
11 300 4000

我想输出“total.txt”文件的行,第一列匹配“index.txt”文件的第一列。同时,第二列输出结果必须大于(>)“index.txt”的第二列并且小于(<)“index.txt”的第三列。

预期结果如下:

1 423
1 2342
2 809
2 5332
2 6762
11 ...
11 ...

我试过这个:

awk '$1==(awk 'print($1)' index.txt) && $2 > (awk 'print($2)' index.txt) && $1 < (awk 'print($2)' index.txt)'  total.txt > result.txt

但它失败了!

你能帮我解决这个问题吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您需要在同一awk脚本中读取这两个文件。阅读index.txt时,将其他列存储在数组中。

awk 'FNR == NR { low[$1] = $2; high[$1] = $3; next }
    $2 > low[$1] && $2 < high[$1] { print }' index.txt total.txt

FNR == NR是您在处理第一个文件时检测到的常见awk习语。

答案 1 :(得分:0)

使用像Barmar这样的连接说:

# To join on the first columns
join -11 -21 total.txt index.txt

如果文件没有按第二列的词汇顺序排序,那么:

join -11 -21 <(sort -k1,1 total.txt) <(sort -k1,1 index.txt)