awkで列の1行からパターンを印刷する方法

awkで列の1行からパターンを印刷する方法

A.txt ファイル (sep=",") があります。

kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
,taq,205920777.1,A01,Unkn-01
,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

次のように、ファイルの最初の列の13行目の後に3行目のパターンを追加したいと思います。

kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

秘密は、A.txtのデータがB.txtの$ 1に印刷されるように、B.txtの区切り文字として「=」を設定することです。私は同様のことを試しました:

awk 'BEGIN{OFS=FS=" = "} NR==3{stuff} } 1' A.txt > B.txt

しかし、私はそれを理解していませんでした。どんなアイデアがありますか?

ありがとう

ベストアンサー1

努力する:

awk -F' = ' 'NR==3{a=$2} {if(NR<14)print; else print a $0}' A.txt

サンプル入力を使用して:

$ awk -F' = ' 'NR==3{a=$2} {if(NR<14)print; else print a $0}' A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09

複数行形式

複数行にわたってコマンドを分散したい場合:

awk -F' = ' '
    NR==3{
        a=$2
    }

    {
        if(NR<14)
            print
        else
            print a $0
    }
    ' A.txt

どのように動作しますか?

  • -F' = '

    これにより、フィールド区切り記号がに設定されます=

  • NR==3{a=$2}

    3行目の場合、2番目のフィールドは変数に保存されますa

  • if(NR<14)print; else print a $0

    行番号が14未満の場合は、その行をそのまま印刷します。残りの行については、a変数の前にある行を印刷します。

更新:最後の4行を除くすべての行に14行の時間を追加します。

awk -F' = ' 'NR==3{t=$2} NR<14{print;next} NR>17{print t d} {d=c;c=b;b=a;a=$0} END{print d ORS c ORS b ORS a}' A.txt

入力ファイルの例:

$ cat A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
,taq,205920777.1,A01,Unkn-01
,taq,neg5,A02,Unkn-09
end1
end2
end3
end4

対応する出力:

$ awk -F' = ' 'NR==3{t=$2} NR<14{print;next} NR>17{print t d} {d=c;c=b;b=a;a=$0} END{print d ORS c ORS b ORS a}' A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09
end1
end2
end3
end4

おすすめ記事