{ 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:
-
nlnumera todas as linhas de entrada e segue seus números de linha com uma string-separator inserida de;semicolon. -
sortclassifica no campo delimitado 2cd;ponto e vírgula em sua entrada - que é seu primeiro campo. -
sedmescla 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. -
sortclassifica novamente no primeiro campo e numericamente desta vez - reorganizando a entrada pela ordem originalmente contada denl. -
cutreduz os números de linha e os delimitadores inseridos originalmente pornl.
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.