我有“文件A”:
10 10011300 10011301 T C
10 10012494 10012495 G A
10 10028691 10028692 A T
10 10093496 10093497 G A
10 10102457 10102458 C T
10 10103252 10103253 G C
10 10122271 10122272 T C
10 10128778 10128779 T C
10 10130299 10130300 C A
10 10148307 10148308 G A
我有文件 1-22:
1 10177 rs367896724
1 10235 rs540431307
1 10352 rs555500075
1 10505 rs548419688
1 10506 rs568405545
1 10511 rs534229142
1 10539 rs537182016
1 10542 rs572818783
1 10579 rs538322974
1 10616 rs376342519
正如你可能知道的那样,我正在处理遗传数据。我想要做的是每次 FileA 中的第 1 列和第 3 列与文件 1-22 中的第 1 列和第 2 列匹配,文件 1-22 中的第 1、2 和 3 列(或 FileA 中的第 1 和 3 列以及文件 1 中的第 3 列) -22) 被打印到一个文本文件中,其中 FileA 和第 1 列中的文件 1-22 之间共享的编号作为文本文件的名称。
到目前为止,我一直坚持对文件进行排序以便能够调用join
. FileA 不断给我一个错误,即使我尝试以与成功对文件 1-22 进行排序的方式完全相同的方式进行排序。
本质上,我希望有一个教程能够完全完成我在这里尝试做的事情。我已经检查了多个不同的来源,并尝试了多次但没有成功。
我使用过的命令:
sort -k 1,1 FileA.txt
join -j 1 File1.txt FileA.txt > output.txt
编辑:
这是所需输出的示例
18 3320671 rs375411568
18 3320673 rs550898405
18 3320676 rs73366565
18 3320704 rs536519819
18 3320720 rs118037107
18 3320736 rs566910986
18 3320755 rs567626849
18 3320786 rs183777311
18 3320860 rs528977928
18 3320887 rs577743595
18 3320897 rs530122744
它看起来与前面的文件 1-22 示例非常相似,这是因为它本质上是相同的东西。我想要 FileA 的第 1 列和第 3 列与文件 x 的第 1 列和第 2 列之间的匹配(x 是编号为 1-22 的一系列文件中的任何一个文件;在本示例中为 18),与匹配行对应的行文件 x 的文件出现并保存在 output.txt 中。
答案1
好吧,我实际上忘记了我问过这个问题,但有人刚刚投票了这篇文章,我已经弄清楚了,所以我会继续发布答案。
对于上面列出的第一个输出片段,
10 10011300 10011301 T C
10 10012494 10012495 G A
10 10028691 10028692 A T
10 10093496 10093497 G A
10 10102457 10102458 C T
10 10103252 10103253 G C
10 10122271 10122272 T C
10 10128778 10128779 T C
10 10130299 10130300 C A
10 10148307 10148308 G A
我需要做的就是使用以下 awk 命令,
cat [inputfile.txt] | awk '{print $1"_"$3"\t"$4"\t"$5}' | sort -k1,1 > outputfileA.txt
输出将如下所示,所有行将按第一列排序:
10_10011301 T C
10_10012495 G A
10_10028692 A T
10_10093497 G A
我也会对第二段代码做同样的事情,
1 10177 rs367896724
1 10235 rs540431307
1 10352 rs555500075
1 10505 rs548419688
1 10506 rs568405545
并使用类似的 awk 命令生成另一个文件:
cat [inputfile.txt] | awk '{print $1"_"$2"\t"$3}' | sort -k1,1 > outputfileB.txt
导致:
1_10177 rs367896724
1_10235 rs540431307
1_10352 rs555500075
1_10505 rs548419688
1_10506 rs568405545
由于这两个输出文件都有一列,并且这些列的排序相同,因此我们可以调用 join 命令:
join -1 1 -2 2 outputfileA.txt outputfileB.txt | tr ' ' '\t' > outputfileC.txt
tr ' ' '\t'
将输出中的所有空格转换为制表符。第一个文件的第一列和第二个文件的第一列之间具有相同匹配的所有行都将写入输出文件,可能如下所示:
1_101850899 A C rs138958619
1_101856556 T C rs191666242
1_101867058 C T rs188447998
1_101874381 A C rs143747209
1_101877269 G A rs186149522
1_101878704 C A rs192815769
1_101885657 G T rs150829467
1_101891797 T G rs141886478
1_101893793 T A rs182950692
1_101897192 T C rs189527356
我希望我解释得很好。如果我需要澄清任何事情,请告诉我。