使用AWK合并基于一个字段的2个文件

时间:2019-01-05 14:13:00

标签: awk

我有2个像这样的文本文件:

文件1:

chr1    90478700    90478750    57  chr1    90478684    90478796    ZNF326  ENST00000340281.4   annotated
chr15   91043226    91043250    1456    chr15   91043226    91043337    IQGAP1  ENST00000268182.5   annotated
chr15   91425050    91425100    107 chr15   91424515    91425105    FURIN   ENST00000268171.3   annotated

文件2:

chr16   84651500    84651520    1192    chr16   84651443    84651520    COTL1   ENST00000262428.4   annotated
chr12   85285700    85285750    928 chr12   85285610    85285899    ZNF326  ENST00000266682.5   annotated
chr16   85822600    85822650    155 chr16   85822579    85822656    FURIN   ENST00000253457.3   annotated

我想根据第八列合并这两个文件。
结果将包含第一个文件和第二个文件中的所有列。
实际上,结果文件将具有20个制表符分隔的列。

我正在尝试在AWK中使用以下命令来执行此操作,但它不会返回预期的输出:

awk 'NR==FNR {a[$8] = 1; next} $8 in a' file1 file2 > results.txt

您知道如何解决吗?

预期输出:

chr1    90478700    90478750    57  chr1    90478684    90478796    ZNF326  ENST00000340281.4   annotated   chr12   85285700    85285750    928 chr12   85285610    85285899    ZNF326  ENST00000266682.5   annotated
chr15   91425050    91425100    107 chr15   91424515    91425105    FURIN   ENST00000268171.3   annotated   chr16   85822600    85822650    155 chr16   85822579    85822656    FURIN   ENST00000253457.3   annotated

1 个答案:

答案 0 :(得分:1)

根据您的描述和数据,这将完成:

awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$8]=$0;next}$8 in a{print a[$8],$0}' file1 file2 > results.txt

输出/ results.txt:

chr1    90478700    90478750    57  chr1    90478684    90478796    ZNF326  ENST00000340281.4   annotated   chr12   85285700    85285750    928 chr12   85285610    85285899    ZNF326  ENST00000266682.5   annotated
chr15   91425050    91425100    107 chr15   91424515    91425105    FURIN   ENST00000268171.3   annotated   chr16   85822600    85822650    155 chr16   85822579    85822656    FURIN   ENST00000253457.3   annotated

我的回答实际上离您自己的尝试还很远。
您必须将file1保存到哈希a,使用$ 8作为密钥。
在file2中,您必须先打印file1的内容,然后再打印file2自己的内容。

请注意,如果file1可以为空,则应将NR==FNR更改为其他文件检查方法,例如GNU awk的ARGIND==1FILENAME=="file2"等。