Mesclar as linhas duplicadas e adicionar “N / A” no final [closed]

2

Eu tenho as seguintes linhas em um arquivo de texto. Quero mesclar as linhas duplicadas e adicionar "N / A" conforme necessário no final da linha, para ter seis colunas em cada linha:

302C21;tSMe
S123C;1.17
302C21;2;346;SM-1-3/SM-1-4
SIEV1;tSMe
S123C;3;2225;20225
SIEV1;1;3;SM-1-1/SM-1-2;5

OUTPUT

SIEV1;tSMe;1;3;SM-1-2;5
302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;3;2225;20225;1.17;N/A
    
por Tony 03.07.2015 / 00:47

1 resposta

5

{   nl   -s\; -w1 -ba    | 
    sort -t\; -k2,2      | 
    sed  -e:n -e'h;$!N'  \
         -e's/^\([^;]*\(;[^;]*;\).*\)\n[^;]*/;/;tn' \
         -ex  -e:N       \
         -e's/;/;/6p;tD' \
         -e's|$|;N/A|;tN'\
         -e:D -ex -eD    |
    sort -t\; -nk1,1     |
    cut  -d\; -f2-;    
}   <in >out

Então há um gasoduto gigante. Funciona assim:

  1. nl numera todas as linhas de entrada e segue seus números de linha com uma string -s eparator inserida de ; semicolon.
  2. sort classifica no campo delimitado 2cd ; ponto e vírgula em sua entrada - que é seu primeiro campo.
  3. sed mescla recursivamente as linhas de entrada com os primeiros campos idênticos e, em seguida, recursivamente anexa a sequência ;N/A à cauda de cada linha até que tenha pelo menos 6 campos.
  4. sort classifica novamente no primeiro campo e numericamente desta vez - reorganizando a entrada pela ordem originalmente contada de nl .
  5. cut reduz os números de linha e os delimitadores inseridos originalmente por nl .

OUTPUT:

302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;1.17;3;2225;20225;N/A
SIEV1;tSMe;1;3;SM-1-1/SM-1-2;5

Estes resultados não são idênticos aos seus. Parece que o seu é classificado em sentido inverso, enquanto estes não são. A menos que você esclareça o que você está procurando, aqui vai você.

P.S. Escrevi isto de tal maneira que não importa se é tudo concatenado em uma única linha - e assim você pode simplesmente remover todas as novas linhas e as barras invertidas precedentes para torná-lo um verso.

Assim:

{ nl -s\; -w1 -ba | sort -t\; -k2,2 | sed -e:n -e'h;$!N' -e's/^\([^;]*\(;[^;]*\;).*\)\n[^;]*/;/;tn' -ex -e:N -e's/;/;/6p;tD' -e's|$|;N/A|;tN' -e:D -ex -eD | sort -t\; -nk1,1 | cut -d\; -f2-; } <in >out

Eu não consigo imaginar por que você gostaria de fazer isso.

    
por 03.07.2015 / 02:15

Tags