如何将一个文本文件与大约两打其他文本文件进行比较,并在匹配时打印出每行的某些列?

如何将一个文本文件与大约两打其他文本文件进行比较,并在匹配时打印出每行的某些列?

我有“文件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

我希望我解释得很好。如果我需要澄清任何事情,请告诉我。

相关内容