说我有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
但是,它只是打印所有匹配的行,我真的不知道如何控制要打印的行数:)
感谢您的帮助!
答案 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以获取更多说明。