Classificando por duas colunas

3

Escreva um script de shell chamado sales1 usando os comandos nawk e sort para fazer o seguinte:
1. imprima o arquivo em duas seções, leste e oeste, com linhas alfabetizadas por sobrenome dentro de cada seção, mostrando por trimestre e total de vendas por pessoa.
2. Imprima os nomes dos vendedores em três grupos:
"As seguintes pessoas tiveram vendas totais superiores a US $ 270:"
"As seguintes pessoas tiveram vendas totais entre US $ 250 e US $ 270:"
"As seguintes pessoas tiveram vendas totais inferiores a US $ 250:"

east:Sam Smith:52:72:78:62  
east:Daniel Liebelt:83:78:84:61  
east:Shirley Couts:66:57:67:37  
east:James Peringer:50:62:56:94  
east:Lilly Batsuro:58:85:84:52  
west:Alex Opitz:79:68:57:93  
west:Carmen Gondar:62:58:85:56  
west:Derek Willard:63:69:74:43  
west:Kim Husak:89:91:63:64  
west:Lenny Taufa:53:61:82:52

Eu só preciso de ajuda com o # 1 ...

Eu tentei

sort -k1,1 -k2,2

Mas só o classifica por leste e depois por oeste e não pelo sobrenome. Estou tentando tratar a primeira coluna como a direção e o primeiro nome e a segunda coluna como o último nome com os números ...

    
por Han 21.03.2016 / 20:24

2 respostas

2

Com awk , você pode pré-adicionar : ao último campo (ou seja, sobrenome e tudo o que segue) sort pelos primeiros e terceiros campos (dessa vez usando : como delimitador de campo) e novamente com awk remove o primeiro : do último campo:

awk '$NF=":"$NF' infile | sort -t : -k1,1 -k3,3 | awk 'sub(/:/, "", $NF)'

resultado final:

east:Lilly Batsuro:58:85:84:52
east:Shirley Couts:66:57:67:37
east:Daniel Liebelt:83:78:84:61
east:James Peringer:50:62:56:94
east:Sam Smith:52:72:78:62
west:Carmen Gondar:62:58:85:56
west:Kim Husak:89:91:63:64
west:Alex Opitz:79:68:57:93
west:Lenny Taufa:53:61:82:52
west:Derek Willard:63:69:74:43
    
por 21.03.2016 / 22:27
0
sed -r 's/^([^:]+):([^ ]+) ([^:]+):.*$/- &/' your-file.txt  | \
    sort | sed -r 's/[^ ]+ (.*)//'

Exemplo:

$ sed -r 's/^([^:]+):([^ ]+) ([^:]+):.*$/- &/' your-file.txt  | sort | sed -r 's/[^ ]+ (.*)//'
east:Lilly Batsuro:58:85:84:52
east:Shirley Couts:66:57:67:37
east:Daniel Liebelt:83:78:84:61
east:James Peringer:50:62:56:94
east:Sam Smith:52:72:78:62
west:Carmen Gondar:62:58:85:56
west:Kim Husak:89:91:63:64
west:Alex Opitz:79:68:57:93
west:Lenny Taufa:53:61:82:52
west:Derek Willard:63:69:74:43

A propósito, é assim que sort seleciona o primeiro campo e o segundo campo quando você o executa com sort -k1,1 -k2,2 :

$ sort --debug -k1,1 -k2,2 ttt.txt
east:Daniel Liebelt:83:78:84:61
___________
           ____________________
_________________________________
east:James Peringer:50:62:56:94
__________
          _____________________
_________________________________
east:Lilly Batsuro:58:85:84:52
__________
          ____________________
________________________________
east:Sam Smith:52:72:78:62
________
        __________________
____________________________
east:Shirley Couts:66:57:67:37
____________
            __________________
________________________________
west:Alex Opitz:79:68:57:93
_________
         __________________
_____________________________
west:Carmen Gondar:62:58:85:56
___________
           ___________________
________________________________
west:Derek Willard:63:69:74:43
__________
          ____________________
________________________________
west:Kim Husak:89:91:63:64
________
        __________________
____________________________
west:Lenny Taufa:53:61:82:52
__________
          __________________
    
por 21.03.2016 / 20:52