Obtenha informações do arquivo .csv e adicione-as depois de determinado padrão

2

Estou trabalhando com as informações deste aluno:

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6

Eu também tenho este arquivo .csv:

id,name,e_mail
st0001, Romeo, [email protected]
st0002, Julian, [email protected]
st0003, Chris, [email protected]
st0004, Richard, [email protected]

Eu gostaria de pegar o id do arquivo .csv e adicioná-lo ao arquivo .dat, assim:

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48
id: st0001    

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2
id: st0002

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42
id: st0003

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6
id: st0004

Até agora eu tentei isso:

#!/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

O último script tem muitos erros.

Eu descobri como obter o id do arquivo .csv:

grep  "[email protected]" students.csv | awk -F "\"*,\"*" '{print $1}'

Como posso adicioná-lo ao arquivo .dat automaticamente?

    
por Cesar Villegas 31.03.2017 / 15:53

1 resposta

3
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

Explicação

Perl options

  • -F Field Separator está definido como ,\s+
  • -l O Separador de registro de saída está definido como \n
  • -a modo de exibição automática = > array @F contém campos $1,$2,...,$NF
  • -n Imprimir somente quando solicitado a + leitura implícita de linhas, a.la., awk

Logic

  • A ordem dos argumentos é um arquivo .csv e depois um arquivo .dat.
  • @ARGV and = > quando o arquivo de entrada sob consideração é .csv, otw .dat
  • Nos dados do arquivo .csv, preencha o hash% h com as chaves como Nome e valor como ID.
  • Agora, quando chegamos ao processo, o arquivo .dat é onde a ação é
  • Em Perl , condition1 .. condition2 é um operador de flip-flop, a.la., , de sed . Mas é mais versátil, no sentido, podemos adicionar mais condições às entradas .. . Em particular, no nosso caso, /^name:\s+(\S+)/ && $h{$a=$1} faz um composto cond1 que quando a linha começa com nome: seguida de múltiplos espaços em branco e então o nome do estudante é capturado e $ h {$ a = $ 1} testa se o nome deste aluno é encontrado com um valor VERDADEIRO. (N.B .: so = > se a ID fosse zero, isso atrapalharia!). O operador flip-flop permanece verdadeiro depois que essa etapa foi tomada e continuamos nela até vermos uma linha vazia ou atingimos EOF . Nesta etapa em particular, enchemos a linha atual $_ com os dados do id do hash.
por 31.03.2017 / 18:54