sed – использовать файл1 для поиска замен, содержащихся в файле2 для строк из файла3

Я новичок здесь и не много писал, я постараюсь сделать это как можно яснее.

Я хочу выполнить поиск и замену, который включает в себя три файла: find.csv идентифицирует строки, содержащие строки. Я хочу заменить всю строку на строку из replace.csv. Третий файл – файл mainfile.csv, который содержит около 1000 строк.

Это то, что у меня есть до сих пор, но я получаю сообщение об ошибке:

sed "s/$(cat find.csv)/$(cat replace.csv)/" mainfile.csv > out.csv sed: 1: "s/CHL_13_R4 DCK_09_R4 ...": unterminated substitute pattern 

Вот как выглядит содержимое файлов:

 find.csv CHL_13_R4 DCK_09_R4 DCK_10_R4 DCK_11_R4 DCK_13_R4 replace.csv CHL_13_R12,CHL_13,R12,10/14/2014 DCK_09_R12,DCK_09,R12,10/14/2014 DCK_10_R32,DCK_10,R32,10/14/2014 DCK_11_R21,DCK_11,R21,10/14/2014 

Основной файл содержит записи как в replace.csv, но около 30 необходимо обновить. Итак, возьмем первую строку в качестве примера. Строку в файле mainfile.csv, которая имеет «CHL_13_R4», должна быть заменена на CHL_13_R12, CHL_13, R12,10 / 14/2014

Спасибо за помощь!

  • Как только выводить строки, которые моложе 3 месяцев?
  • Bash - Замена случайного числа между кавычками
  • как извлечь часть текста из файла между согласованными условиями
  • С помощью sed я хочу заменить первый блок текста, который соответствует
  • Согласование шаблонов и удаление этого шаблона с помощью sed
  • Добавление одного файла во второй до конца файла
  • Изменить заголовок с помощью sed или awk
  • как вычесть первое значение из последнего в столбце по строке в оболочке?
  • One Solution collect form web for “sed – использовать файл1 для поиска замен, содержащихся в файле2 для строк из файла3”

    Сначала создайте сценарий sed из этих двух файлов:

     paste -d$'\t' find.csv replace.csv | sed -e 's:/:\\/:g; s:\t:/:; s:^:s/:; s:$:/g;:' > myscript.sed 

    Это заменит все вхождения строк в find.csv со строками в replace.csv . Он будет терпеть неудачу, если какая-либо из строк в find.csv содержит символ табуляции, поскольку это используется paste в качестве разделителя между соединенными строками.

    Результат выглядит следующим образом:

     s/CHL_13_R4/CHL_13_R12,CHL_13,R12,10\/14\/2014/g; s/DCK_09_R4/DCK_09_R12,DCK_09,R12,10\/14\/2014/g; s/DCK_10_R4/DCK_10_R32,DCK_10,R32,10\/14\/2014/g; s/DCK_11_R4/DCK_11_R21,DCK_11,R21,10\/14\/2014/g; s/DCK_13_R4//g; 

    (обратите внимание, что последняя строка не имеет замены. Это потому, что ваш find.csv имел 5 строк, а ваш replace.csv имел только 4 строки)

    Если вы хотите заменить всю строку, содержащую строки, на find.csv :

     paste -d$'\t' find.csv replace.csv | awk -F$'\t' '{gsub(/\//,"\\/"); print "/"$1"/ s/^.*/"$2"/;"}' > myscript.sed 

    Вывод этой версии выглядит следующим образом:

     /CHL_13_R4/ s/^.*/CHL_13_R12,CHL_13,R12,10\/14\/2014/; /DCK_09_R4/ s/^.*/DCK_09_R12,DCK_09,R12,10\/14\/2014/; /DCK_10_R4/ s/^.*/DCK_10_R32,DCK_10,R32,10\/14\/2014/; /DCK_11_R4/ s/^.*/DCK_11_R21,DCK_11,R21,10\/14\/2014/; /DCK_13_R4/ s/^.*//; 

    В любом случае, какая версия лучше всего подходит для вас, как только вы сгенерировали скрипт myscript.sed , запустите его на своем mainfile.csv :

     sed -f myscript.sed mainfile.csv 

    (необязательно используйте -i если вы хотите сделать «на месте» редактирование на mainfile.csv )

    ПРИМЕЧАНИЕ. Это можно сделать без использования временного файла, такого как myscript.sed для хранения сценария. Большинство версий sed могут запускать скрипты из stdin. Но этот способ позволяет вам изучить и / или отредактировать созданный скрипт sed перед его запуском в вашем основном файле.

    Linux и Unix - лучшая ОС в мире.