私は同様の質問が提起されたことを知っていますが、私は初心者であり、過去数ヶ月間しかLinuxに触れていませんでした。
単一行の複数の文字列をCSVに示されている特定の一致文字列に置き換えたいと思います。
例: ファイル 1:
(((1[&label=1],2[&label=1])[&label=5]),3[&label=2])
file2.csv(csv列2つ):
1[&label, "1[&tag=2,label"
2[&label, "2[&tag=5,label"
3[&label, "3[&tag=3,label"
1行のファイルを(etc ...)に置き換えると、次1[&label
のようになります。1[&tag=2,label
(((1[&tag=2,label=1],2[&tag=5,label=1])[&label=5]),3[tag=3,&label=2])
csvには[&label
別のラベル()を持たない1[&label
項目は含まれていませんが、[&label
最終出力ファイルにはこれらの項目がまだ必要です。
ベストアンサー1
Bashを使用してこれを行う1つの方法は次のとおりです。
#!/bin/bash
# read the line to act upon
line=$(head -n 1 $1)
while read substitution
do
# get the first field, delimited by a comma
findvar=`echo $substitution | cut -d, -f1`
# remove the quotes and get the second field, delimited by a space
replacevar=`echo $substitution | sed 's/"//g' | cut -d' ' -f2`
# replace all occurrences of the find variable with the replacement
line=${line//$findvar/$replacevar}
done < $2
echo $line
このスクリプトの名前を指定した場合
substitute.sh
それから電話してもいい
sh substitute.sh file1 file2.csv
これには次のようないくつかの前提があります。
- CSV形式は説明とまったく同じです。あなたの例では、最初の列の値は引用されていませんが、2番目の列の値は引用されています。また、この例では区切り文字の後にスペースが含まれています。実際のCSV形式が異なる場合は、スクリプトを調整する必要があります。
- CSVの置換は一度に1つずつ処理されるため、後の置換は以前に行われた置換と一致する可能性があります。これはあなたの意図ではないかもしれません。
たとえば、入力ラインが次のような場合
foo bar baz
CSVファイルを次のように置き換えます。
foo, "bar"
bar, "baz"
あなたは結果です
bar baz baz
しかし、結果は次のとおりです。
baz baz baz