次のファイルがあります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
(たとえば、1つ以上,
)を含む行のみを処理しますが、列ヘッダーを含む最初のフィールドは処理しないようにします。
修正する
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"