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
Perloptions
-
-FField Separator está definido como,\s+ -
-lO Separador de registro de saída está definido como\n -
-amodo de exibição automática = > array@Fcontém campos$1,$2,...,$NF -
-nImprimir 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.,,desed. 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 compostocond1que 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 operadorflip-floppermanece verdadeiro depois que essa etapa foi tomada e continuamos nela até vermos uma linha vazia ou atingimosEOF. Nesta etapa em particular, enchemos a linha atual$_com os dados do id do hash.