Como separar o conteúdo da primeira coluna em linhas diferentes

1

Eu tenho os dados de entrada com 5 colunas separadas por guias:

Class1,Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4,Class5 info1b info2b1,info2b2 info3b info4b

Quando eu tenho, na primeira coluna, dados separados por vírgula, gostaria de separá-los por linhas diferentes com as mesmas informações da segunda a quinta colunas, por exemplo:

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b

Eu não tenho ideia de como fazer isso. Alguma sugestão?

    
por Paul 05.06.2017 / 23:21

3 respostas

1
Solução

awk :

awk '$1~/.+,.+/{ split($1,a,","); $1=""; sub(/^ */,"",$0); 
     for(i=1;i<=length(a);i++) print a[i],$0; next }1' file

A saída:

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b
  • $1~/.+,.+/ - linha de processo se a primeira coluna contiver itens separados por vírgulas
  • split($1,a,",") - divide a primeira coluna em uma matriz de itens
por 05.06.2017 / 23:33
1
perl -F'\t' -lane '$,="\t";
   print $_, @F for split /,/, splice @F, 0, 1;
' yourfile

Resultados

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b
    
por 05.06.2017 / 23:36
1

POSIX sed

TAB=$(printf \t) NL=$(printf \nn | sed -e '$!s/$/\/')
sed -e "s/^\([^,${TAB}]*\),\([^${TAB}]*\)\(.*\)/${NL%?}/;P;D" yourfile

Primeiramente, definimos as variáveis TAB e newline que podem ser usadas em um comando sed com aspas duplas, na ausência da seqüência de escape \t e \n não estarem disponíveis em POSIX sed no lhs e rhs respectivamente do comando s/// sed.

Resultados

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b
    
por 05.06.2017 / 23:56

Tags