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.,,
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 compostocond1
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 operadorflip-flop
permanece 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.