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

  • удобное форматирование вывода
  • Почему регулярное выражение с \\ $ \ {работает с egrep, но не с sed?
  • Расширить обработку цепочки трубопроводов (... Asterisk -> grep -> ping)
  • Изменение структуры файла журнала Linux для использования с kst
  • Что значит \? среднее значение в регулярном выражении?
  • Можно ли вывести две конкретные вещи вывода?
  • Развернуть переменную среды из PIPE (SHELL)
  • Использование grep / sort / find для извлечения уникальных значений
  • 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 из хеша.
    Interesting Posts

    Является ли `ls -l` сортировка файлов неинтуитивно?

    Добавление почтовых ящиков Postgres в PATH: следует ли «экспортировать»?

    Существуют ли «эзотерические» (странные), но совместимые со стандартами компиляторы C или время автономной работы?

    Временное управление оболочкой

    Как использовать wget или другой инструмент для загрузки файла, для которого ссылка скрыта (активируется только при щелчке)

    В XFCE, как настроить анимированный GIF в качестве фона рабочего стола?

    Инициализируемый крючок Initramfs

    Как добавить статический маршрут в Virtual Guest для доступа к сети хоста?

    используя доступный через vpn

    Не удается открыть как корневой терминал, так и nautilus (в Debian 7) после обновления графического драйвера Intel

    Параметры команды загрузки из файла верхнего уровня

    Могу ли я установить заставку, чтобы начать, если я не смотрю видео?

    Zsh: автоматическое изменение выполняемой команды

    Что использует всю память в моей виртуальной машине? Это не кэш диска

    Как отслеживать вызовы, вызываемые пользователем во FreeBSD с помощью аудита?

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