Uma maneira de fazer isso usando o editor sed é:
sed -e '
s/,/\n/
s/\(\n.*[[:blank:]]\)\([^,]*\),/ /
P;D
' input.file
Trabalhando:
- Recorte o elemento principal separado por vírgulas do segundo campo.
- Em seguida, anexe esse elemento ao elemento separado por vírgula líder do primeiro campo.
- Imprima o elemento principal do primeiro campo e exclua-o depois disso.
- Repita este procedimento com o que resta no espaço do padrão até que esteja vazio.
Outro método usando o Perl é:
perl -lane '
my($kref, $vref, %h) = map { [split /,/] } @F[0,1];
@h{@$kref} = @$vref;
print "$_ $h{$_}" for @$kref;
' input.file
Outra maneira é mostrada aqui:
perl -lpe 'print "$1 $3" while s/^([^,]*),(.*\h)([^,]*),/$2/' input.file
Trabalhando:
- Olhe para o regex desta forma: (Perl lê em uma linha de cada vez do arquivo) então:
-
^ ([^,] *) escolherá o elemento principal separado por vírgulas da linha atual. Isso é armazenado na variável $ 1.
-
(. * \ h) preservará, para a próxima iteração do loop while, o conteúdo intermediário que começa no segundo elemento separado por vírgulas do primeiro campo até o início do segundo elemento separado por vírgulas. do segundo campo. Isso é armazenado na variável $ 2.
-
([^,] *) deve selecionar o elemento principal separado por vírgula do segundo campo da linha atual. Isso é armazenado na variável $ 3.
- Agora, "$ 1 $ 3" é impresso no STDOUT e a linha é reduzida para $ 2. O laço while agora executa a operação novamente nesta linha editada, que é $ 2 da linha anterior, ..... isto se repete até que o s /// seja bem sucedido. O fracasso vem quando ficamos sem vírgulas. Nesse ponto, o que permanece na linha, "c 5" é impresso em STDOUT pelo comportamento padrão de perl no modo -p.
- Arranque os elementos principais separados por vírgulas dos primeiro e segundo campos.
- Imprima esses elementos e também reduza o registro atual removendo.
- Faz um loop sobre o registro atual enquanto está tendo 2 vírgulas.
- O último par é impresso automaticamente devido à opção -p do Perl.
perl -lane '
my($kref, $vref) = map { [split /,/] } @F;
print shift @$kref, " ", shift @$vref while @$kref && @$vref;
' input.file
Trabalhando:
As chaves - são armazenadas em uma matriz @ $ kref, valores correspondentes em @ $ vref. Não há hashes envolvidos aqui.
- imprima a parte superior das matrizes simultaneamente e, em seguida, remova a parte superior ... enxágue, repita enquanto as duas matrizes não estão vazias.
Saída:
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8