awk를 사용하여 일치하는 항목이 있으면 인쇄하고 그렇지 않으면 떠나는 방법

awk를 사용하여 일치하는 항목이 있으면 인쇄하고 그렇지 않으면 떠나는 방법

결과 파일이 있습니다 A.tsv(구분 기호 = \t).

BC01    2551    99
BC03    2547    95
BC04    2578    99
BC05    2547    97

그리고 샘플 정보가 포함된 파일 B.tsv(구분자 = \t):

BC01
BC04
BC02
BC03
BC05

누락된 예제를 추가하고 싶습니다 A.tsv(단, 새 파일로 인쇄) B.tsv.

BC01    2551    99
BC02
BC03    2547    95
BC04    2578    99
BC05    2547    97

지금까지 몇 가지 awk 명령을 시도했지만 결과는 없었습니다.

awk -v OFS="\t" 'NR==FNR{a[$1]=$1;next}{print $0};NR!=FNR{a[$1]=$1;next}{print $1}' B.tsv A.tsv > C.tsv

어떻게 하는지 아시나요?

답변1

이러한 파일을 처리하는 올바른 방법은 A.tsv키를 사용하여 사전으로 디코딩 $1하고 전체 줄의 내용을 저장한 다음 이를 사용하여 B.tsv값을 찾는 것입니다.

awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next } 
  ( $1 in arr ){ print arr[$1]; next } { print $1 }' A.tsv B.tsv

최종 결과를 정렬하려면 $1두 파일의 내용을 모두 색인화하고 END값이 없으면 키를 개별적으로 인쇄하여 처리 해야 할 수도 있습니다.

awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next } 
  !( $1 in arr ) { arr[$1] } END { for (x in arr) print arr[x] ? arr[x] : x }' A.tsv B.tsv

관련 정보