0

假设我有 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

但是,它只是打印所有匹配的行,我真的被困在如何控制要打印的行数上:)

我感谢您的帮助!

4

2 回答 2

2

试试这个:

awk 'NR==FNR{a[$1]=$2; next} a[$1]-- > 0' filter.txt map.txt
于 2013-08-29T06:54:12.330 回答
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

在此处查看更多说明。

于 2013-08-29T07:06:17.707 回答