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(たとえば、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"

おすすめ記事