如何替换 csv 中单行上的不同文本?

如何替换 csv 中单行上的不同文本?

我知道也有人问过类似的问题,但我是一个新手,最近几个月才刚刚接触 Linux,我的问题的细节使我无法针对我的问题采用其他解决方案。

我希望用 CSV 中指示的特定匹配字符串替换单行中的不同字符串。

示例:文件1:

(((1[&label=1],2[&label=1])[&label=5]),3[&label=2])

file2.csv(两列 csv):

1[&label, "1[&tag=2,label"
2[&label, "2[&tag=5,label"
3[&label, "3[&tag=3,label"

我想在单行文件中用(等......)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 的一种方法:

#!/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 格式与您描述的一致。在您的示例中,第一列中的值没有加引号,但第二列中的值加了引号。此外,该示例在分隔符后包含一个空格。如果实际的 CSV 格式不同,则需要调整脚本。
  • 由于 CSV 中的替换是一次处理一个,因此后面的替换可能会与之前进行的替换相匹配。这可能不是你的本意。

例如,如果您的输入行是

foo bar baz

您的 CSV 文件替换为

foo, "bar"
bar, "baz"

您可能希望结果是

bar baz baz

但结果会是

baz baz baz

相关内容