{ 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:
-
nl
numera todas as linhas de entrada e segue seus números de linha com uma string-s
eparator inserida de;
semicolon. -
sort
classifica no campo delimitado 2cd;
ponto e vírgula em sua entrada - que é seu primeiro campo. -
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. -
sort
classifica novamente no primeiro campo e numericamente desta vez - reorganizando a entrada pela ordem originalmente contada denl
. -
cut
reduz 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.