Problema de ordenação de várias colunas Unix

3

Estou tentando classificar um arquivo:

TX001;A0004|Number|5|0|Y|1        
TX001;A0110|VARCHAR|5|0|Y|4         
TX001;A1332|VARCHAR|15|0|Y|3         
TX001;B3321|VARCHAR|15|0|Y|5         
TX001;C1321|VARCHAR|15|0|Y|2      
TY001;A1234|Number|5|0|Y|3        
TY001;C2335|VARCHAR|5|0|Y|1        
TY001;B2133|VARCHAR|15|0|Y|2        
TZ001;A1234|Number|5|0|Y|3    
TZ001;A2133|VARCHAR|5|0|Y|1  
TZ001;C0133|VARCHAR|15|0|Y|2

O resultado de saída esperado é:

TX001;A0004|Number|5|0|Y|1   
TX001;C1321|VARCHAR|15|0|Y|2   
TX001;A1332|VARCHAR|15|0|Y|3  
TX001;A0110|VARCHAR|5|0|Y|4  
TX001;B3321|VARCHAR|15|0|Y|5  
TY001;C2335|VARCHAR|5|0|Y|1  
TY001;B2133|VARCHAR|15|0|Y|2  
TY001;A1234|Number|5|0|Y|3  
TZ001;A2133|VARCHAR|5|0|Y|1      
TZ001;C0133|VARCHAR|15|0|Y|2  
TZ001;A1234|Number|5|0|Y|3

Eu preciso classificar com base na última coluna numérica. Quando eu tento a classificação usando -n , a ordem da primeira coluna está mudando.

Tentou usar sort -t "|" -k 6,6n FNAM.txt , mas resulta na classificação numérica que chame a primeira ordem da coluna.

Por favor, ajude a classificar com base na última coluna numericamente, mantendo a primeira coluna do nome da tabela não afetada.

    
por APS 15.12.2015 / 10:06

2 respostas

6

sort pode classificar em várias colunas com tipos diferentes, mas exige que o delimitador seja um único caractere. Para lidar com o seu exemplo e produzir a saída esperada, você pode substituir o primeiro ';' com '|', em seguida, classifique na primeira coluna alfanumericamente, em seguida, no sétimo (ex-sexto) numericamente e, finalmente, substitua o primeiro '|' com ';':

sed 's/;/|/' < FNAM.txt | sort -t\| -k1,1 -k7,7n | sed 's/|/;/'

A variante que você tentou,

sort -t "|" -k 6,6n FNAM.txt

classifica o arquivo completo somente na sexta coluna, numericamente; sort não tem conhecimento de nenhuma estrutura sobre a qual você não fala, portanto, ela não sabe que deve agrupar as linhas pelos primeiros caracteres. Então você acaba com a última coluna completamente ordenada, o que significa misturar os nomes das tabelas.

    
por 15.12.2015 / 10:26
8

Com qualquer compatível com POSIX sort :

sort -t"|" -k1,1.6 -k6n file
  • -t"|" define o delimitador como | .
  • -k1,1.6 classifica o primeiro campo a partir do início até o sexto caractere 1 .
  • -k6n sort então o 6º campo numérico.

1 Na página do manual:

POS is F[.C][OPTS], where F is the field number and C the character position in the field;
    
por 15.12.2015 / 10:28

Tags