
결과 파일이 있습니다 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