Возьмите информацию из 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 файл автоматически?

  • Удалите совпадающую строку и еще несколько из файла
  • grep искать error_log и отправлять сообщения только по электронной почте, когда результаты будут найдены?
  • Какова фактическая цель опции -X GNU grep и почему она недокументирована?
  • Извлечение части строки с помощью grep / sed / awk
  • grep неправильно читает шаблон из переменной
  • grep игнорировать специальные символы в файле
  • Отфильтровать вывод команды по цвету
  • используйте gff2fasta вместо сценария bash, чтобы получить части ДНК-последовательностей из полного генома
  • 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 из хеша.
    Linux и Unix - лучшая ОС в мире.