awk에서 헤더를 사용하여 두 파일의 데이터를 병합하는 방법

awk에서 헤더를 사용하여 두 파일의 데이터를 병합하는 방법

두 개의 파일 이 있습니다 A.tsv.B.tsv

A.tsv(필드 구분 기호 = \t):

Sample ID   Internal Control    Result  Consensus   
4686427 Pass    Not Detected    Not Available
4666275 Pass    Detected    Not Available
4666295 Pass    Detected    Available
4644444 Pass    Detected    Available

B.tsv(필드 구분 기호 = \t):

seqName clade   substitutions   deletions
4666295 A8A yes no
4666275 18A no  yes
4686427 161 no  yes

이 두 파일을 다음과 같이 새 파일로 병합하고 싶습니다.

Sample ID   Internal Control    Result  Consensus   clade   substitutions   deletions   
4686427 Pass    Not Detected    Not Available   161 no  yes
4666275 Pass    Detected    Not Available   18A no  yes
4666295 Pass    Detected    Available   A8A yes no
4644444 Pass    Detected    Available

이것을 작성했지만 헤더나 두 번째 파일의 첫 번째 줄이 인쇄되지 않습니다.

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

그렇다면 올바르게 수행하는 방법은 무엇입니까? 감사해요

추신: 파일을 서브샘플링했는데 실제 파일은 행과 열 측면에서 더 큽니다.

답변1

노력하다:

awk 'BEGIN        { FS=OFS="\t" }
     NR==FNR      { seq=$1; sub(/[^\t]*\t/,""); if(NR==1)hdr=$0; hold[seq]=$0; next }
     FNR==1       { print $0, hdr; next }
     ($1 in hold) { print $0, hold[$1]; next }
                  { print }' fileB fileA >fileC

답변2

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ key = (FNR>1 ? $1 : RS) }
NR == FNR {
    $1 = ""
    map[key] = $0
    next
}
{ print $0 map[key] }

$ awk -f tst.awk B.tsv A.tsv
Sample  ID      Internal Control        Result Consensus        clade   substitutions   deletions
4686427 Pass    Not Detected    Not Available   161     no      yes
4666275 Pass    Detected        Not Available   18A     no      yes
4666295 Pass    Detected        Available       A8A     yes     no
4644444 Pass    Detected        Available

$ awk -f tst.awk B.tsv A.tsv | column -s$'\t' -t
Sample   ID    Internal Control  Result Consensus  clade  substitutions  deletions
4686427  Pass  Not Detected      Not Available     161    no             yes
4666275  Pass  Detected          Not Available     18A    no             yes
4666295  Pass  Detected          Available         A8A    yes            no
4644444  Pass  Detected          Available

관련 정보