AWK根据另一个文件的列过滤文件

时间:2018-08-02 04:54:14

标签: linux unix awk

我有两个文件。第一个文件如下所示(但长数千行:

Chr10:2-20 0 0 0 0
Chr1:390-32032 1 2 0 0 
Chr3:32-3020 0 0 1029 20
Chr4:30239-40000 10 15 10 20
Chr10:2-20 9 9 1 8
Chr7:0-80 1 0 3 9
Chr8:0-30 8 6 3 3

第二个文件看起来像这样(但也有数千行)

Chr1:390-32032
Chr4:30239-40000
Chr3:32-3020
....
Chr4:30239-40000

我想生成第三个文件,仅当该Chr记录在第二个文件中时才从第一个文件中提取数据。因此,第三个文件如下所示:

Chr1:390-32032 1 2 0 0 
Chr4:30239-40000 10 15 10 20
Chr3:32-3020 0 0 1029 20
Chr4:30239-40000 10 15 10 20

我对代码的想法是使用AWK和fnr == nr函数。可能将第一列放入数组吗?我似乎无法正常工作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

以下awk构造应该可以完成您想要的工作。

awk 'NR==FNR{a[$1][$0];next} $0 in a {for (i in a[$0]) print i}' file1.txt file2.txt

位置:

a[$1]:在file1传递期间,创建一个二维数组a,其中包含file1的第一列($ 1)和整行($ 0)。

$0 in a:在file2传递期间,检查file2的整行($ 0)是否在数组a的第一个索引中

{for (i in a[$0]) print i}:如果存在,则扫描子数组并打印值。该值将是第一个文件的$ 0。