Classificação de texto simples por conteúdo de final de linha

0

Eu tenho uma lista de texto simples organizada no seguinte formato:

[nome do caminho do arquivo] [nome da faixa] [nome do artista] [valor numérico]

por exemplo:

C:\Users\Somi\Music\Shaheedi.mp3    Shaheedi [By.NagRa] [Rp] Pasla Jatha Birmingham 140.01
C:\Users\Somi\Music - Idgaf.mp3  Idgaf   Bohemia (www.nannu.info)    88.01   
C:\Users\Somi\Music - Klasikhz - Hangower.mp3    Hangower    Klasikhz    101.06  
C:\Users\Somi\Music. Manni Sandhu  -  Pegg 2012[CrazyMasti.Com].mp3   4.  Manni Sandhu  -  Pegg 2012[CrazyMasti.Com]  Manni Sandhu[CrazyMasti.Com]    103.01  
C:\Users\Somi\Music. Manni Sandhu  -  Jaan Sadi[CrazyMasti.Com].mp3   5. Manni Sandhu  -  Jaan Sadi[CrazyMasti.Com]   Manni Sandhu[CrazyMasti.Com]    94.01   
C:\Users\Somi\Music. Manni Sandhu  -  Gidhian Di Rani[CrazyMasti.Com].mp3 6. Manni Sandhu  -  Gidhian Di Rani[CrazyMasti.Com] Manni Sandhu[CrazyMasti.Com]    95.00   
C:\Users\Somi\Music. Manni Sandhu  -  Door Ni Kulne[CrazyMasti.Com].mp3   7. Manni Sandhu  -  Door Ni Kulne[CrazyMasti.Com]   Manni Sandhu[CrazyMasti.Com]    94.00   
C:\Users\Somi\Music. Manni Sandhu  -  Bottle[CrazyMasti.Com].mp3  8. Manni Sandhu  -  Bottle[CrazyMasti.Com]  Manni Sandhu[CrazyMasti.Com]    123.99  

Cada entrada na lista é separada da subseqüente por um retorno fixo. Também parece que o valor numérico do terminal é separado do resto da linha por uma tabulação. Existe alguma maneira de classificar essas entradas pelo valor numérico desse terminal? Ou seja, existe alguma maneira de conseguir que todos sejam organizados de forma que os valores numéricos do terminal sejam ascendentes ou descendentes?

Estou executando o OS X Lion, mas, se necessário, posso simplesmente transferir o arquivo de texto para uma máquina Windows.

Qualquer ajuda é apreciada.

    
por voxanimus 17.05.2013 / 08:20

3 respostas

3

Se os campos de entrada não forem separados sem ambiguidade, por exemplo Como os títulos também contêm espaços, você não pode assumir um índice de coluna específico para seu valor numérico. Portanto, você precisa de uma ferramenta que seja capaz de extrair a coluna última , independentemente de seu índice. awk pode fazer isso:

awk '{ printf $NF; $NF=""; print "", $0 }' input.txt | sort -rn

Explicação:

  • printf $NF imprime o último campo. printf é necessário porque um print normal também imprime uma nova linha.
  • $NF está desmarcado, então basicamente removemos a última coluna.
  • print "", $0 imprime a linha inteira prefixada com um único espaço.
  • Em seguida, ele é classificado numericamente ( -n ) e invertido ( -r ).

Esta solução funciona com os comandos BSD nativos do OS X, bem como com as ferramentas GNU que vêm com o Linux.

No seu caso particular, o arquivo não está bem formatado. Você tem um caractere Tab antes de cada nova linha, então isso é analisado incorretamente como o último campo. Para o seu arquivo, o comando awk seria o seguinte. Aqui, NF-1 refere-se ao segundo ao último campo.

awk '{ printf $(NF-1); $(NF-1)=""; print "", $0 }' test_sort_list.txt | sort -rn

Exemplo:

% head -n 5 test_sort_list.txt
C:\Users\Somi\Music\(DJNagRa) Nachna Pawu - TeamPBN By NagRa.mp3    Nachna Pawu(DJNagRa)    TeamPBN(DJNagRa)    96.00
C:\Users\Somi\Music\(DJNagRa) Ni Goriyeh ft Billa Bakshi DJ Rags By NagRa.mp3   Ni Goriyeh (feat. Billa Bakshi)(DJNagRa)    DJ Rags(DJNagRa)    132.28
C:\Users\Somi\Music\(UMP) 08 Jassi J & Bhinda Jatt - Khushiya.mp3   Khushiya    (UMP) Jassi J & Bhinda Jatt 100.00
C:\Users\Somi\Music\(UMP) 09 Jassi J, Manjit Pappu & Cheshire Cat - Sadde Ton Piyara (Remix).mp3    Sadde Ton Piyara (Remix)    (UMP) Jassi J, Manjit Pappu & Cheshire Cat  85.99
C:\Users\Somi\Music\-  Baagi Ja Badshah - Bol Dehliye [www.Bhangracrew.com].mp3 Baagi Ja Badshah - Bol Dehliye  [BC] Santnam Singh Arshi Jatha  40.00

% awk '{ printf $(NF-1); $(NF-1)=""; print "", $0 }' test_sort_list.txt | sort -rn | head -n 5
250.00 C:\Users\Somi\Music\bilzkashif-bb06(www.songs.pk).mp3 Dil Nahin Lagda The Bilz and Kashif
250.00 C:\Users\Somi\Music\[WwD] Panjabi MC - Bari Barsi (12 Months) [iTunes-Rip].mp3 Bari Barsi (12 Months) Panjabi MC [www.worldwidedesis.com]
164.28 C:\Users\Somi\Music\Darh Tere Teh-VipJaTT.CoM.mp3 Darh Tere Teh-VipJaTT.CoM
164.07 C:\Users\Somi\Music\Jado Kade Tohar Shohar-VipJaTT.CoM.mp3 Jado Kade Tohar Shohar [VipJaTT.CoM] Gippy Grewal [VipJaTT.CoM]
164.04 C:\Users\Somi\Music\Dil Nachda.mp3 Dil Nachda Diljit VipJaTT.CoM
    
por 17.05.2013 / 08:52
2

Converta o arquivo para UTF-8 e LF primeiro:

$ file test_sort_list.txt
test_sort_list.txt: ISO-8859 English text, with very long lines, with CRLF line terminators
$ iconv -f iso-8859-1 -t utf-8 test_sort_list.txt | tr -d '\r' > test_sort_list2.txt
$ file test_sort_list2.txt
test_sort_list2.txt: UTF-8 Unicode English text, with very long lines

Em seguida, use sort -nk4:

sort -t$'\t' -rnk4 test_sort_list2.txt
    
por 18.05.2013 / 12:29
1

Com apenas uma linha de entrada, é difícil dizer exatamente o que você precisa. Se todo o seu arquivo estiver no mesmo formato, então:

sort -k 10 input

Seria suficiente para sua entrada de amostra. Se você tiver linhas de tamanho variável, terá que adicionar uma etapa extra para encontrar a última coluna. Esta resposta ao SO é provavelmente algo que você está procurando para.

    
por 17.05.2013 / 08:38