別のファイルにパターンがある場合は、awkを使用して1つのファイルの文字列を置き換える方法

別のファイルにパターンがある場合は、awkを使用して1つのファイルの文字列を置き換える方法

データファイルがありますA.txt(フィールド区切り記号= \ t)。

Well    Well Type   Well Name   Dye Target  
A1      Unknown     HIGH-001    FAM ViroFAM                 
A1      Unknown     HIGH-001    HEX ViroHEX

そしてテンプレートファイルB.txt

kit
Software Version = NOVA_v1
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.

=2行目の値で置換を印刷したいが、パターンが5列目にある場合にのみ可能です。B.txtVIRO_v1ViroHEXA.txt

そのために、私は次のような作業を始めました。

awk -F'\t' '
  FNR==NR{ a[NR]=$2; next }
  $1=="Software Version"{ print $0,"VIRO_v1"; next }
  1
' B.txt FS=" =" B.txt > result.txt

しかし、私はその部分を把握できませんでしたA.txt。何をすべきか知っていますか?

答え1

awk -F'\t' '
  NR==FNR{ if ($5=="ViroHEX"){ viro=1 } next }
  viro && $1=="Software Version"{ $2="VIRO_v1" }
  1
' A.txt FS=" = " OFS=" = " B.txt > result.txt

最初のフィールドが最初のファイルの列5と同じで、どこにでも表示される場合、2番目のファイルの2番目のフィールド()がNOVA_v1置き換えられます。VIRO_v1Software VersionViroHEX

2番目のファイルのフィールド区切り文字は<space>=<space>(タブではない)と仮定します。

答え2

〜のようにBernbaumのソリューションただし、実際に一致して挿入する内容については、さらに注意してください。

awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt &&
sed '2 s/=.*/= VIRO_v1/' B.txt

これは、最初にファイル内のタブで区切られた5番目のフィールドにawk正しい文字列が表示されることを確認するために使用されます。必要以上のファイルの内容は読み取られず、後で条件付き実行に使用される終了状態で終了します。ViroHEXA.txtsed

このsedコマンドは、=2行目の最初の文字のすべての内容をB.txt文字列に置き換えます= VIRO_v1

A.txtファイルに5番目の列が含まれていない場合、出力はViroHEX生成されません。

次のバリアントは常にB.txtファイルを生成し、可能であれば2行目で置き換えが行われます。

if awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt
then
    sed '2 s/=.*/= VIRO_v1/'
else
    cat
fi <B.txt

行2を変更せずに行2を変更したい場合は、Software Version = ...呼び出しに使用された式をsed次のように変更します。

s/^\(Software Version = \).*/\1 VIRO_v1/

答え3

私の謙虚な意見では、より簡単な解決策です。残念ながら、awkに加えて他のツールを使用しています。

awk '{print $5}' A.txt | grep -q VIROHEX && sed 2s/NOVA/VIRO/ B.txt

&&の前の部分は条件を実装し、プログラムはsedB.txtファイルのテキストを置き換えます。

編集:私の解決策が怠惰であることを指摘したAdminBeeに感謝します。より良いもの:

awk '{print $5}' A.txt | grep -q VIROHEX && sed '2s/=.*/= VIRO_v1/' B.txt

関連情報