CSVの1行に別のテキストを置き換える方法は?

CSVの1行に別のテキストを置き換える方法は?

私は同様の質問が提起されたことを知っていますが、私は初心者であり、過去数ヶ月間しか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

おすすめ記事