AWK for ループを入力として使用して検索と置換

AWK for ループを入力として使用して検索と置換

2つのファイルがあります。

Ref.txt には以下が含まれます。

ABCDEFG,15147,ABC,ABCD,ABCDE
HIJKLMN,500,HIJKLM,HIJKL,HIJK

および以下を含むSeq.txt

ABCDEFG
ABCXXXX
ABCDXXX
ABCDEXX
HIJKXXX
HIJKLXX
HIJKLMX
HIJKLMN

Ref.txtファイルの各行の3-endフィールドに対してSeq.txtファイルを検索し、文字列を含む行をその行の最初のフィールドの文字列に置き換えたいと思います。この例で私が探している出力は次のとおりです。

ABCDEFG
ABCDEFG
ABCDEFG
ABCDEFG
HIJKLMN
HIJKLMN
HIJKLMN
HIJKLMN

これは間違ったコードですが、次のコマンドを考えています。

awk '{for(i=3; i<=NF; i++) gsub( $i , $1)}

ただし、forループはRef.txtファイルを参照し、gsubコマンドはSeq.txtファイルで実行されます。

ベストアンサー1

|これを行うことを検討する1つの方法は、Ref.txtの各行の3番目の終わりフィールドで正規表現を連結し、値でキー付き連想配列に格納して単一の正規表現を作成することです$1

その後、各Seq.txtのキーを繰り返すことができます$1

awk -F, '
  NR==FNR {
    # construct a single ERE as $3|$4|$5|etc. keyed on $1
    for(i=3;i<=NF;i++) r[$1] = r[$1] == "" ? $i : r[$1] "|" $i;
    next
  } 
  {
    # test $1 against each ERE and substitute the first matching key
    for(k in r) {
      if ($1 ~ r[k]) {
        $1 = k; 
        break
      }
    }
  }
  1
' Ref.txt Seq.txt

おすすめ記事