我有以下两个文本文件:
第一个:
chr10 1000 1001 DEL 2.4807 chr10 7443 8978
chr10 1005 1008 DEL 1.2799 chr10 7321 8778第二个:
chr13 3456 6746 chr10 7443 8978
chr13 6453 8767 chr10 7321 8778我们可以看到它们有一个共同的模式:
chr10 7443 8978
chr10 7321 8778因此,基于此模式,我如何将它们组合成:
chr10 1000 1001 DEL 2.4807 chr10 7443 8978 chr13 3456 6746
chr10 1005 1008 DEL 1.2799 chr10 7321 8778 chr13 6453 8767谢谢
编辑:我一直在尝试grep,比如:
cat text1|grep -f `cat text2|awk '{print $4"\t"$5"\t"$6}'`但它不起作用
发布于 2012-03-29 00:42:30
您可以在awk一行程序中处理这三个字段。这是一个证据:
[ghoti@pc ~]$ cat file1
chr10 1000 1001 DEL 2.4807 chr10 7443 8978
chr10 1005 1008 DEL 1.2799 chr10 7321 8778
[ghoti@pc ~]$ cat file2
chr13 3456 6746 chr10 7443 8978
chr13 6453 8767 chr10 7321 8778
[ghoti@pc ~]$ awk 'NR == FNR { what[$(NF-2),$(NF-1),$(NF)] = $0; next; } { printf("%s %s\n", what[$(NF-2),$(NF-1),$(NF)], $0); }' file1 file2
chr10 1000 1001 DEL 2.4807 chr10 7443 8978 chr13 3456 6746 chr10 7443 8978
chr10 1005 1008 DEL 1.2799 chr10 7321 8778 chr13 6453 8767 chr10 7321 8778
[ghoti@pc ~]$ 如果您希望文件的顺序不同,只需在printf()中更改$0和what[]的顺序即可。
请注意,这里假设您可以将第一个文件的全部内容加载到内存中的数组中。可能不应该用于数百万行的文件,但这将完全取决于您运行它的系统。
这是如何工作的?
awk脚本有两个主要部分,每个部分都用大括号括起来。第一部分仅在NR (到目前为止读取的所有数据的当前记录号)与FNR (当前文件中的记录号)匹配时运行。换句话说,它只作用于第一个文件。第一个文件以关联数组的形式加载到内存中,该数组的下标是该行的最后三个字段。
第二部分作用于第一个文件之后的每个后续文件。它只是打印当前行,但是在前面加上与当前行的最后三个字段相匹配的数组内容(在第一部分中匹配)。
https://stackoverflow.com/questions/9911598
复制相似问题