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