awk에서 구문 분석한 후 같은 줄에 붙여넣는 방법

awk에서 구문 분석한 후 같은 줄에 붙여넣는 방법

다음과 같은 파일이 있습니다 A.txt(필드 구분 기호 = ,).

Kit Batch Export
Software Version = NO_v1
Date And Time of Export =
Experiment Name =
Instrument Software Version =
Instrument Type = Cji
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Nov
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis,EC,CH
,novaprime-ct044032-TB_2034,2061571293,A01,Unkn-01,VALID,,,
,novaprime-ct044032-TB_2034,2061584371,A02,Unkn-09,VALID,,,

그리고 B.csv(필드 구분 기호 = \t; 첫 번째 열은 비어 있습니다):

    Well    Fluor   Target  Content Sample  Cq  SQ
    A01 Cy5 EC  Unkn-01 2060563935  26  NaN
    A02 Cy5 CH  Unkn-09 2060565055  37  NaN
    A01 Cy5 CH  Unkn-01 2060565888  54  NaN
    A02 Cy5 EC  Unkn-09 2060565465  NaN NaN

B.txtA.txtWell/Target의 각 행에 대한 값(Cq 열)을 해당 행/열(예: A01/EC;A01/CH;A02/EC;A02/CH)에 다음과 같이 추가하고 싶습니다 .

Kit Batch Export
Software Version = NO_v1
Date And Time of Export =
Experiment Name =
Instrument Software Version =
Instrument Type = Cji
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Nov
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis,EC,CH
,novaprime-ct044032-TB_2034,2061571293,A01,Unkn-01,VALID,,,,26,54
,novaprime-ct044032-TB_2034,2061584371,A02,Unkn-09,VALID,,,,NaN,37

이를 위해 나는 다음을 시도합니다.

awk -F"\t" 'FNR==NR{if (a[$2]) {a[$2]=a[$2] "," $7} else {a[$2]=$7}} NR>FNR{split($0,f,","); if (a[f[4]]) $0=$0 "," a[f[4]]; print}' B.txt A.txt > C.txt

작동하지만 EC인지 CH인지 인식할 때가 아니라 첫 번째 반복이 발생할 때 값을 붙여넣습니다. 그렇다면 이를 올바르게 수행하는 다른 방법이 있습니까? 감사해요

답변1

"제목" 줄에 쉼표가 없으면 다음이 작동합니다.

awk -F'\t' 'FNR==NR{if ($4=="EC") ec[$2]=$7; else if ($4=="CH") ch[$2]=$7; next}
            NR>FNR&&NF>1 {if (!f) f=1; else {$10=ec[$4]; $11=ch[$4];}}1' B.txt FS=',' OFS=',' A.txt

이는 먼저 B.txt"EC-to-Well" 맵과 "CH-to-Well" 맵을 구문 분석하고 생성한 다음 구문 분석할 때 사용됩니다 A.txt. 필드 구분 기호를 ,for 으로 설정하고 A.txt여러 필드(예: 하나 이상 ,)가 있는 행만 처리되지만 열 헤더가 포함된 첫 번째 필드는 처리되지 않도록 합니다.

고쳐 쓰다

B.txt때때로 교체를 확인하고 싶은 빈 필드가 있을 수 있다는 의견을 댓글에서 지적하셨으므로 NaN추가 확인이 필요합니다.

awk -F'\t' 'FNR==NR{if ($4=="EC") ec[$2]=$7; else if ($4=="CH") ch[$2]=$7; next}
            NR>FNR&&NF>1 {if (!f) f=1; else {$10=ec[$4]?ec[$4]:"NaN"; $11=ch[$4]?ch[$4]:"NaN";}}1' B.txt FS=',' OFS=',' A.txt

매우 "골프적"이지만 기본적으로는

$10=ec[$4] ? ec[$4] : "NaN"

방법

if (ec[$4]) $10=ec[$4]; else $10="NaN"

관련 정보