$ cat ip.txt
B00000|1|def|b12
B00001|1|xyz|a11
B00000|1|abc|b11
B00001|1|def|ab1
B00001|2|ghi|bc2
B00002|1|abc|ac1
B00002|1|xyz|bc2
$ perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }
' ip.txt
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
B00000|1|def,abc|b12,b11
B00001|1|xyz,def|a11,ab1
- A linha de entrada é dividida em três partes, por ex:
B00000|1|
, def
e b12
. O espaço em branco à direita na linha é ignorado
- Em duas variáveis hash diferentes, com a mesma chave, os valores
$v1
e $v2
são anexados. ,
é adicionado se o valor de hash da chave não estiver vazio
- Depois que todas as linhas são processadas, a saída é impressa
Se a entrada e as chaves estiverem ordenadas:
$ sort ip.txt | perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (sort keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }'
B00000|1|abc,def|b11,b12
B00001|1|def,xyz|ab1,a11
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2