awk根据另一个文件的列搜索和打印行数?

时间:2013-08-29 01:28:37

标签: search join awk merge

说我有2个文件如下。基本上,我想合并这两个文件,但我想根据filter.txt的第二列打印map.txt中的行数(请参阅output.txt中的预期结果)

cat > filter.txt
a    3
b    2
c    6

cat > map.txt
a    a001
a    a002
a    a003
a    a004
a    a005
a    a006
a    a007
a    a008
a    a009
a    a010
a    a011
a    a012
b    b01
b    b02
b    b03
b    b04
c    c01
c    c02
c    c03
c    c04
c    c05
c    c06
c    c07

我知道有很多方法可以像while循环这样做但我认为如果我处理数千条记录,awk命令会更有效地获得此结果:

output.txt:
a    a001
a    a002
a    a003
b    b01
b    b02
c    c01
c    c02
c    c03
c    c04
c    c05
c    c06

我试图从这个命令中弄明白:

awk 'NR==FNR{a[$1]=$2; next} {if(a[b=$1]) {print $0}}' filter.txt map.txt

但是,它只是打印所有匹配的行,我真的不知道如何控制要打印的行数:)

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

试试这个:

awk 'NR==FNR{a[$1]=$2; next} a[$1]-- > 0' filter.txt map.txt

答案 1 :(得分:1)

awk 'FNR==NR{a[$1]=$2;next}(($1 in a) && a[$1]-- >0){print}' filter.txt map.txt

测试:

> awk 'FNR==NR{a[$1]=$2;next}(($1 in a) && a[$1]-- >0){print}' temp temp1
a    a001
a    a002
a    a003
b    b01
b    b02
c    c01
c    c02
c    c03
c    c04
c    c05
c    c06
> 

简化方式:

awk 'FNR==NR{a[$1]=$2;next}(($1 in a) && a[$1]-- >0)' filter.txt map.txt

请查看here以获取更多说明。