비교를 사용하여 두 파일을 비교하려고 하며 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
즉, 그대로 인쇄됩니다.d
MSTRG3.1
COTJA
어쨌든 그렇죠. 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
대규모 데이터세트의 경우 다음을 참조하세요.스티브의 솔루션메모리 효율성이 더 좋습니다.