하나의 텍스트 파일을 약 24개의 다른 텍스트 파일과 비교하고 일치하는 경우 각 줄의 특정 열을 인쇄하려면 어떻게 해야 합니까?

하나의 텍스트 파일을 약 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

두 번째 코드 부분에서도 동일한 작업을 수행합니다.

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

내가 잘 설명했으면 좋겠다. 명확히 해야 할 사항이 있으면 알려주시기 바랍니다.

관련 정보