Как найти целые предложения в файле CSV и заменить его предложениями из другого файла, используя bash? - PullRequest
0 голосов
/ 07 ноября 2018

Итак, у меня есть два файла 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 может измениться в соответствии с моими потребностями, и я хочу найти решение, которое не требует изменения скрипта или код. Что-то вроде создания двумерного массива, а затем проверки, существует ли значение в первом столбце файла 2 в файле file1, а затем его замены соответствующей записью во втором столбце файла file2.csv

Итак, после запуска файла сценария оболочки 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 голосов
/ 08 ноября 2018

Использование Perl One liner.

$ 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.

$
0 голосов
/ 07 ноября 2018

Использование 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 ищет каждое полное предложение в каждой входной записи и заменяет его строкой замены.
0 голосов
/ 07 ноября 2018

Краткий рубиновый скрипт:

ruby -rcsv -e '
    sentences = CSV.read(ARGV.shift).to_h
    File.foreach(ARGV.shift, chomp: true) {|line| puts sentences[line] || line}
' file2.csv file1
0 голосов
/ 07 ноября 2018

С Баш и Сед:

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

Выход:

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

Точка может быть проблемой, потому что это специальный символ в регулярном выражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...