使用awk将文件中的两列映射到另一个文件

时间:2015-12-02 13:23:46

标签: awk

我有一个大文件.pagination { margin: auto; text-align: center; outline: medium none; padding: 0; position: relative; color: #000000; font-family: Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px; } .label { color: #ffffff; display: inline-block; font-size: 11.844px; font-weight: bold; line-height: 14px; padding: 2px 4px; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); vertical-align: baseline; white-space: nowrap; } (制表符分隔),大约有800万行,文件如下所示:

A

另一个文件1 10001 1 10005 1 10019 1 10055 1 10108 看起来像这样:

B

我想要的是将文件#CHROM POS ID REF ALT QUAL FILTER INFO 1 10001 . T C . . AF=0.0000384;AC=1;AN=26028;DS=SS6004475 1 10002 . A C,T . . AF=0.0001153,0.0000384;AC=3,1;AN=26028;DS=HGDP00927|HGDP00998|HGDP01284,HGDP01029 1 10002 . A AT . . AF=0.0000384;AC=1;AN=26028;DS=HGDP00521 1 10003 . A C,T . . AF=0.0000384,0.0000768;AC=1,2;AN=26028;DS=HGDP01284,HGDP00521|HGDP00927 1 10004 . C A . . AF=0.0000384;AC=1;AN=26028;DS=HGDP01284 1 10018 . C T . . AF=0.0000384;AC=1;AN=26028;DS=HGDP00998 1 10019 rs775809821 TA T . . AF=0.0000384;AC=1;AN=26028;END=10020;DS=Malay 1 10055 rs768019142 T TA . . AF=0.0000384;AC=1;AN=26028;DS=Malay 1 10108 rs62651026 C T . . AF=0.0000768;AC=2;AN=26028;DS=HGDP00778|HGDP0456 中的列与文件A的前两列匹配,并将文件B的第3列中的信息添加到文件{{1 }}。如果没有匹配,我想输出B。期望的输出将是这样的。 A文件还有几条带NA的注释行,我想在阅读文件时避免使用。输出将是这样的:

B

由于

2 个答案:

答案 0 :(得分:3)

您可以编写类似

的内容
awk 'NR==FNR{line[$1" "$2]=$3; next} ($0 in line){print $0,line[$0]; next} {print $0, "NA"}' file2 file1

示例

$ awk 'NR==FNR{line[$1" "$2]=$3; next} ($0 in line){print $0,line[$0]; next} {print $0, "NA"}' file2 file1
1 10001 .
1 10005 NA
1 10019 rs775809821
1 10055 rs768019142
1 10108 rs62651026

它的作用是什么?

  • NR==FNR{line[$1" "$2]=$3; next}如果输入文件是第一个文件(由NR==FNR处理),那么我们将$3保存在line索引的$1" "$2中{1}}。

  • ($0 in line){print $0,line[$0]; next}对于第二个文件,如果当前行位于line,则打印该行,然后输入file2中的值。

  • {print $0, "NA"}如果不打印后跟NA的行。

答案 1 :(得分:0)

您的第1列是否仅包含数值?这些包含超过1-2位数?您是否期望第二列中的数字大于5-9位?这两个文件是否按数字排序(即sort -k1n,1 -k2n,2)?第1列和第2列的组合在每个文件中是唯一的(或者它们是否包含重复项)?如果您对以上所有问题的回答都是肯定的,那么这是另一种解决方案。

join -a1 -o 1.2,1.3,2.2 -e "NA" \
<(awk '{printf("%02d:%09d\t%s\t%s\n", $1, $2, $1, $2)}' A) \
<(cat B | grep -v ^# | awk '{printf("%02d:%09d\t%s\n", $1, $2, $3)}')

如果文件B被gzip压缩,则只需使用zcat Bgunzip -c B代替cat B