Возьмите информацию из CSV-файла и добавьте его после определенного шаблона

Я работаю с информацией этого ученика:

name: Romeo e_mail: letsrock@hotmail.com Room: 0/48 street: 1/0/48 name: April e_mail: thebestmonth@hotmail.com Room: 0/4 street: 1/0/4 name: Julian e_mail: julian688@gmail.com Room: 0/2 street: 1/0/2 name: Charles e_mail: charlesuniv@yahoo.com Room: 0/1 street: 1/0/1 name: Chris e_mail: todoras@hotmail.com Room: 0/42 street: 1/0/42 name: Richard e_mail: richiisfun@gmail.com Room: 0/6 street: 1/0/6 

У меня также есть этот CSV-файл:

 id,name,e_mail st0001, Romeo, letsrock@hotmail.com st0002, Julian, julian688@gmail.com st0003, Chris, todoras@hotmail.com st0004, Richard, richiisfun@gmail.com 

Я хотел бы взять идентификатор из CSV-файла и добавить его в файл .dat, например:

 name: Romeo e_mail: letsrock@hotmail.com Room: 0/48 street: 1/0/48 id: st0001 name: April e_mail: thebestmonth@hotmail.com Room: 0/4 street: 1/0/4 name: Julian e_mail: julian688@gmail.com Room: 0/2 street: 1/0/2 id: st0002 name: Charles e_mail: charlesuniv@yahoo.com Room: 0/1 street: 1/0/1 name: Chris e_mail: todoras@hotmail.com Room: 0/42 street: 1/0/42 id: st0003 name: Richard e_mail: richiisfun@gmail.com Room: 0/6 street: 1/0/6 id: st0004 

До сих пор я пробовал это:

 #!/bin/bash FILE1=students.dat FILE2=table.csv while read line; do if [[ $line == name* ]]; then echo -e "\n$line" expectIp=1 elif [[ $line == *e_mail* && $expectIp -eq 1 ]]; then sed 's/^\s*//' <<< $line unset expectIp elif [[ $line == Room* ]]; then Room=$(echo $line | grep -o 'Room[^,]*,' | sed 's/,//') echo $Room echo $line | grep -o 'street*' justRoom=$(echo $Room | sed 's/Room: //') grep -A1 \"$justRoom\" $FILE2 | grep -o 'id' fi done < $FILE1 

В последнем скрипте много ошибок.

Я нашел, как получить идентификатор из файла .csv:

 grep "richiisfun@gmail.com" students.csv | awk -F "\"*,\"*" '{print $1}' 

Как я могу добавить его в .dat файл автоматически?

One Solution collect form web for “Возьмите информацию из CSV-файла и добавьте его после определенного шаблона”

 perl -F',\s+' -lane ' @ARGV and $h{$F[1]}=$F[0],next; /^name:\s+(\S+)/ && exists $h{$a=$1} .. /^$/ || eof and do{ /^$/ || eof and $_ .= (/^$/ ? $, : $\) . ("id: " . $h{$a} // "") . (eof ? $, : $\); }; print; ' table.csv students.dat 

объяснение

Perl

  • -F Полевой разделитель установлен в значение ,\s+
  • -l Выходной разделитель записи установлен на \n
  • -a Autosplit mode => array @F содержит поля $1,$2,...,$NF
  • -n Печатать только при запросе + неявной readin строк, a.la., awk

логика

  • Порядок аргументов – CSV-файл, а затем .dat-файл.
  • @ARGV and => при рассмотрении входного файла .csv, otw .dat
  • Из данных файла .csv запишите хэш% h с ключами как имя и значение как идентификатор.
  • Теперь, когда мы приходим к обработке файла .dat, это место, где действие
  • В Perl condition1 .. condition2 является флип-флоп-оператором, a.la., sed . Но он более универсален, в том смысле, мы можем добавить дополнительные условия для входных данных. В частности, в нашем случае /^name:\s+(\S+)/ && $h{$a=$1} делает для составного cond1 что когда строка начинается с имени: за ней следует несколько пробелов, а затем имя студента и $ h {$ a = $ 1} проверяет, найдено ли это имя студента с ИСТИННЫМ значением. (NB: so =>, если ID должен быть нулевым, это будет срабатывать!). Оператор flip-flop остается верным после того, как этот шаг был сделан, и мы держимся на нем, пока не увидим пустую строку, или мы не попали в EOF . На этом конкретном этапе мы наполняем текущую строку $_ данными id из хеша.
  • Матч RH с grep
  • Как захватить головную часть сайта с помощью команды curl и grep?
  • Подавлять конкретные экземпляры ключа поиска в grep
  • grep для IP без последнего октета как 0
  • Извлечь имя группы из `id` и сохранить ее в переменной
  • Grep файл в определенном поле
  • grep выходит из-за использования плунжера - могу ли я заставить grep не использовать столько бара?
  • найти и заменить значение в строке текста
  • удаление строк между строками в текстовом файле с помощью awk или sed
  • Копирование файлов, содержащих определенную структуру сохранения текста
  • grep - многострочный рисунок
  • grep изменение строки, за которой следует переменная
  • Linux и Unix - лучшая ОС в мире.