ファイル内のすべての単語を読み取り、見つかった場合に別のファイルの代替単語に置き換える方法

ファイル内のすべての単語を読み取り、見つかった場合に別のファイルの代替単語に置き換える方法

一つ一つ読まなければならないフルワードファイルの各行を使用するsedか、awkその単語がファイルにある場合は別のファイルの単語に置き換えます。

A.txtファイルの内容:

1, This is a Record One, Value1, Dummy_val1 One, $$MOON$$
2, This is a Record Two, Value2, Dummy_val2 Two, #LATER
3, This is a Record Three, Value3, Dummy_val3 Three, #LATER
4, This is a Record Four, Value4, Dummy_val4 Four, $$MOON$$

その後、Search_Replace_File.txtは、どの単語をどの単語に置き換えるべきかについての情報を提供します。

One=Ten
Two=Twenty
Three=Thirty
Four=Forty
$$MOON$$=SUN
#LATER=SNOW

予想される出力は次のとおりです。

1, This is a Record Ten, Value1, Dummy_val1 Ten, SUN
2, This is a Record Twenty, Value2, Dummy_val2 Twenty, SNOW
3, This is a Record Thirty, Value3, Dummy_val3 Thirty, SNOW
4, This is a Record Forty, Value4, Dummy_val4 Forty, SUN

メモ:

  1. リスト内の古い単語が新しい単語に置き換えられている場合、新しい単語と他の単語のマッピングがマッピングファイルに存在する場合は、それでも置き換えることができます。
  2. 代替文字列には、以下の記号を含めることもできます。 $$MOON$$=日曜日 #LATER=雪

これまで、次のコードを試しましたが、単語を置き換えません。

#!/bin/bash
while read var
do
search_string=`echo "$var"|awk -F= '{print $1}'`
replace_string=`echo "$var"|awk -F= '{print $2}'`
sed "s/$searchstring/$replacestring/g" fileA.csv > fileB.csv
done < Search_Replace_File.txt

mv fileB.csv fileA.csv

ベストアンサー1

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ cat tst.awk
BEGIN { FS="=" }
NR==FNR {
    map[$1] = $2
    next
}
{
    head = ""
    tail = $0
    while ( match(tail,/[^,= ]+/) ) {
        old = substr(tail,RSTART,RLENGTH)
        new = (old in map ? map[old] : old)
        head = head substr(tail,1,RSTART-1) new
        tail = substr(tail,RSTART+RLENGTH)
    }
    print head tail
}

$ awk -f tst.awk Search_Replace_File.txt fileA.txt
1, This is a Record Ten, Value1, Dummy_val1 Ten, SUN
2, This is a Record Twenty, Value2, Dummy_val2 Twenty, SNOW
3, This is a Record Thirty, Value3, Dummy_val3 Thirty, SNOW
4, This is a Record Forty, Value4, Dummy_val4 Forty, SUN

上記の仮定は、入力単語に,=または空白が含まれていないが、他の文字は含まれるということです。

また、古い単語が新しい単語にマッピングされ、その新しい単語が他の新しい単語にもマッピングできる場合、上記のコードはそうしません。これは無限再帰が発生し、最初のマッピングのみが保存されるためです。

おすすめ記事