awk를 사용하여 파일을 비교하고 두 파일의 출력을 병합하시겠습니까?

awk를 사용하여 파일을 비교하고 두 파일의 출력을 병합하시겠습니까?

비교를 사용하여 두 파일을 비교하려고 하며 awk두 파일의 데이터를 출력으로 인쇄하고 싶습니다. 제가 비교하는 파일은 아래와 같습니다.

파일 1:

gene             feature id            fc         
a                gene                 MSTRG.1.1           
b                gene                 MSTRG.1.2   
c                gene                 MSTRG.2.1 
d                gene                 MSTRG.3.1   

파일 2:

MSTRG.1.1       ALLMI        
MSTRG.3.1       COTJA   
MSTRG.4.1       SORCY 

나는 다음 명령을 사용하고 있습니다 :

$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1

나는 출력을 다음과 같이 원한다:

a ALLMI
c COTJA
d SORCY,

그러나 현재는 다음과 같은 결과만 얻습니다.

a    
c    
d

두 파일 모두 탭으로 구분되어 있는데 왜 내 명령이 작동하지 않는지 잘 모르겠습니다.

답변1

이상한 솔루션

이건 어때. 제공한 정확한 출력을 제공하지 않지만 이유가 확실하지 않습니다. d SORCY즉, 그대로 인쇄됩니다.dMSTRG3.1COTJA

어쨌든 그렇죠. 10명이 시작했습니다. GNU Awk v4.0.2에서 잘 작동합니다.

$ awk 'NR==FNR{a[$1]=$2}NR!=FNR&&FNR>1&&a[$3]{print $1,a[$3]}' file2 file1
a ALLMI
d COTJA
$

NR이 FNR과 동일하면 첫 번째 파일에 있으므로 배열이 채워집니다.

NR이 FNR과 다르면 두 번째 파일에 있으므로 해당 파일의 첫 번째 레코드(헤더)를 지나고 필드 3이 배열에 있으면 이를 인쇄합니다.

"골프" awk 솔루션

가독성은 떨어지지만 코드는 더 짧습니다.

awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}

솔루션에 참여하세요

또는 구현을 위해 특별히 사용할 필요가 없는 경우 awk에만 사용하세요 join.

$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$

-1 3파일 1의 필드 3( )과 파일 2의 필드 1( )을 사용하여 파일을 연결합니다 -2 1. 그런 다음 파일 1의 필드 1과 파일 2의 필드 2를 인쇄합니다. 빙고.

답변2

이 시도,

 awk  'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1"\t"$3}'  file2 file1
  • \t구분 기호로 필요하지 않습니다 .
  • 귀하의 요구 사항에 따라 첫 번째 및 세 번째 필드를 인쇄해야 합니다.

답변3

귀하의 코드,

awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1

print마지막에는 첫 번째 열만 출력되므로 두 개의 열은 절대 출력될 수 없습니다 File1.

하지만 거의 다 왔습니다. 사소한 조정 중 하나는 실제로 누락된 필드를 출력하는 것입니다.

awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $3, $1}' File2 File1
                                                                   ^^^
                                                                 add this

데이터에 대해 이것을 실행하면 다음이 생성됩니다.

MSTRG.1.1 a
MSTRG.3.1 d

대규모 데이터세트의 경우 다음을 참조하세요.스티브의 솔루션메모리 효율성이 더 좋습니다.

관련 정보