一つ一つ読まなければならないフルワードファイルの各行を使用する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
メモ:
- リスト内の古い単語が新しい単語に置き換えられている場合、新しい単語と他の単語のマッピングがマッピングファイルに存在する場合は、それでも置き換えることができます。
- 代替文字列には、以下の記号を含めることもできます。 $$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
上記の仮定は、入力単語に,
、=
または空白が含まれていないが、他の文字は含まれるということです。
また、古い単語が新しい単語にマッピングされ、その新しい単語が他の新しい単語にもマッピングできる場合、上記のコードはそうしません。これは無限再帰が発生し、最初のマッピングのみが保存されるためです。