我有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
答案 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==1
或FILENAME=="file2"
等。