如何在csv文件中查找整个句子,并使用bash将其替换为另一个文件中的句子?

时间:2018-11-07 18:35:15

标签: linux bash shell awk sed

所以我有两个文件file1和file2:

file1:
my name is xyz.
my name is abc.
I am a doctor.
I am an engineer.
I like dogs.
I like cats.

我想用较短的句子代替其中一些句子。所以我创建了另一个文件file2.csv

file2.csv:
"my name is xyz.","name xyz"
"my name is abc.","name abc"
"I am a doctor.","doctor"
"I like dogs.","dogs"

到目前为止,我已经使用了sed,如果在sed命令中单独输入所有这些行,它们就可以正常工作,但是file1和file2的内容可能会根据我的需要而改变,我需要一个不需要更改脚本的解决方案或代码。 类似于创建二维数组,然后检查file2的第一列中的值是否在file1中,然后将其替换为file2.csv的第二列中的相应条目。

因此,在我运行shell脚本文件1后,应该如下所示:

name xyz.
name abc.
doctor.
I am an engineer.
dogs.
I like cats.

请注意,文件1和文件2中的内容可以更改,也可以添加新条目,因此可以使用类似的

sed -i 's/I like dogs/dogs/' file1.csv

不可行。

4 个答案:

答案 0 :(得分:2)

使用bash和sed:

sed -f <(sed 's|","|/|; s|"|/|g; s|^|s|' file2.csv) file1

输出:

name xyz
name abc
doctor
I am an engineer.
dogs
I like cats.

点可能是一个问题,因为它是正则表达式中的特殊字符。

答案 1 :(得分:0)

使用awk

awk -F'"(,")?' '
  NR==FNR { r[$2] = $3; next }
  { for (n in r) gsub(n, r[n]) } 1' file2.csv file1
  • -F'"(,")?'是字段分隔符,与"","匹配,因此我们不需要从字段中删除双引号,
  • NR==FNR { r[$2] = $3; next }使用完整句子作为键并将替换字符串作为值,使用内容为file2.csv的数组填充
  • { for (n in r) gsub(n, r[n]) } 1在每个输入记录中搜索每个完整句子,并将其替换为替换字符串。

答案 2 :(得分:0)

简洁的红宝石脚本:

ruby -rcsv -e '
    sentences = CSV.read(ARGV.shift).to_h
    File.foreach(ARGV.shift, chomp: true) {|line| puts sentences[line] || line}
' file2.csv file1

答案 3 :(得分:0)

使用Perl One衬板。

$ cat file1
my name is xyz.
my name is abc.
I am a doctor.
I am an engineer.
I like dogs.
I like cats.

$ cat file2.csv
"my name is xyz.","name xyz"
"my name is abc.","name abc"
"I am a doctor.","doctor"
"I like dogs.","dogs"

$ perl -ne ' BEGIN {%kvp=map{chomp;s/\"//g;split "," } qx(cat file2.csv)} { chomp;print $kvp{$_}?"$kvp{$_}.\n":"$_\n"; } ' file1
name xyz.
name abc.
doctor.
I am an engineer.
dogs.
I like cats.

$