다음과 같은 파일이 있습니다 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.txt
A.txt
Well/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"