두 목록 사이를 grep

두 목록 사이를 grep

내 Linux 컴퓨터에는 두 개의 파일이 있습니다. 첫 번째 "list.txt"에는 개체 목록(2649개 개체)이 포함되어 있고, 두 번째 "list_interactors.txt"에는 이전 목록(719개 개체)의 일부 개체가 포함된 더 짧은 목록이 포함되어 있으며, 각 개체에는 일부 관련 변수가 나열되어 있습니다. 다른 개체에서는. "list_interactors" 파일에 있는 모든 개체(2649)의 목록과 특정 개체의 관련 변수를 가져오고 싶습니다.

예:

문서list.txt

6tyr_A_002__________
7yer_2_009__________
3erf_1_001__________
2dr5_D_2-3__________

문서list_interactors.txt

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX

output.txt

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________

나는 프로그래밍 언어에 그다지 실용적이지 않습니다. 이 스크립트에서 grep 함수를 사용하려고 합니다.

grep -f list.txt list_interactors.txt

그러나 출력은 "list_interactors.txt" 파일과 유사한 파일입니다.

저 좀 도와 주 시겠어요?

답변1

$ join -a 1  <( sort list.txt ) <( sort list_interactors.txt )
2dr5_D_2-3__________
3erf_1_001__________ 3erf2_B QAEF6R XXXXX
6tyr_A_002__________ 6tyr1_B QRT54R AAAAA
7yer_2_009__________

join이는 두 파일 간의 관계형 JOIN 작업을 수행하는 데 사용됩니다 . 기본적으로 첫 번째 필드가 조인 키로 사용됩니다.

-a 1옵션을 사용하면 join두 번째 파일에 일치하는 항목이 없더라도 첫 번째 파일의 모든 행이 출력됩니다("왼쪽 조인" 수행).

입력 데이터를 join정렬해야 하며, sort명령줄에서 두 개의 프로세스 대체를 통해 각 파일을 개별적으로 호출하여 정렬해야 합니다. 파일을 미리 정렬하도록 선택할 수도 있습니다.

-t $'\t'데이터가 탭으로 구분된 경우 명령 시작 부분에 매개 변수를 추가해야 할 수도 있습니다 join. 이렇게 하면 출력에 기존 탭 구분 기호가 유지됩니다.

>output.txt출력을 파일에 저장하려면 명령 끝에 추가하여 출력을 리디렉션합니다.

답변2

계속 정렬하려면 다음을 사용할 수 있습니다 awk.

awk '
    FNR==NR {s[$1]=$0}
    FNR!=NR {if(s[$1]) print s[$1]; else print $0}
' list_interactors.txt list.txt

산출:

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________

답변3

$ awk 'NR==FNR{a[$1]=$0; next} {print ($1 in a ? a[$1] : $0)}' list_interactors.txt list.txt
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________

답변4

Perl oneliner는 또한 다음을 수행할 수 있습니다:

$ perl -ane ' { chomp;$s{$F[0]}=$_; } END { print "$s{$_}\n" for sort(keys(%s))  }' list.txt list_interactors.txt 
2dr5_D_2-3__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________

관련 정보