1つのテキストファイルを約24の異なるテキストファイルと比較し、一致する場合は、各行の特定の列を印刷するにはどうすればよいですか?

1つのテキストファイルを約24の異なるテキストファイルと比較し、一致する場合は、各行の特定の列を印刷するにはどうすればよいですか?

「ファイル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 FileAの列1と3、およびFileの列3)と一致する場合マダです。 1〜22)は、テキストファイル名で、1列のFileAとFile 1〜22の間で共有される番号を使用してテキストファイルとして印刷されます。

joinこれまで、ファイル1-22を正常にソートしたのと同じ方法でソートしようとすると、エラーが発生する.FileAを呼び出すことができるようにファイルをソートするのが困難になりました。

本質的に、私はここでやりたいことを正確に行うチュートリアルを楽しみにしています。複数の異なるソースを確認して何度も試しましたが、成功しませんでした。

私が使ったコマンド:

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

これは、以前のFile 1-22の例と非常によく似ているようです。これは本質的に同じです。 FileA の列 1 と 3 とファイル x の列 1 と 2 の間の一致が必要です (x は、1 から 22 の番号の一連のファイルのいずれかです。この例では 18)。一致する項目に対応する行ファイル x のファイル行が表示され、出力.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

2番目のコード部分でも同じことを行います。

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

両方の出力ファイルには1つの列があり、列の順序は同じであるため、Joinコマンドを呼び出すことができます。

join -1 1 -2 2 outputfileA.txt outputfileB.txt | tr ' ' '\t' > outputfileC.txt

tr ' ' '\t'出力のすべてのスペースをタブに変換します。最初のファイルの最初の列と 2 番目のファイルの 1 番目の列の間に等しく一致するすべての行が出力ファイルに書き込まれます。これは次のとおりです。

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

よく説明してほしいです。明確にする必要がある場合は、お知らせください。

おすすめ記事