outra pergunta com ordenação no bash [duplicado]

1

Como posso ignorar o espaço em "Kuala Lumpur" ao classificar esta lista? Eu trapaceei as tabulações e classifiquei na guia que me dá os resultados certos, mas eu gostaria de saber como lidar com um espaço em uma coluna porque reformatar uma lista não parece ser um bom hábito para entrar , especialmente se a lista for muito maior.

Obrigado antecipadamente

  Kuala Lumpur        78          56

  Seoul               86          66

  Karachi             95          75

  Tokyo               85          60

  Lahore              85          75

  Manila              90          85

POR CIDADE:

Karachi             95          75

Kuala Lumpur        78          56

Lahore              85          75

Manila              90          85

Seoul               86          66

Tokyo               85          60

Eu também classifico por alta temperatura (alta-baixa, segunda coluna) e baixa temperatura (baixa-alta, terceira col)

POR ALTA TEMPERATURA:

 Karachi             95          75

 Manila              90          85

 Seoul               86          66

 Lahore              85          75

 Tokyo               85          60

 Kuala Lumpur        78          56

POR BAIXA TEMPERATURA:

  Kuala Lumpur        78          56

  Tokyo               85          60

  Seoul                86          66

  Karachi             95          75

  Lahore              85          75

  Manila              90          85
    
por healix 04.04.2013 / 07:01

3 respostas

0

1) converta seus espaços em aba pelo comando unexpand (considere que cada 8 espaços seja uma aba)

2) use a classificação com TAB delimiter desta maneira:

TAB='echo -e "\t"'
sort -t"$TAB" YOUR_FILE
    
por 04.04.2013 / 07:25
0

Nota: - Sua pergunta é alterada duas vezes, mas não posso alterar a resposta várias vezes, mas desejo informar que a resposta permanecerá igual, basta classificar o número da coluna usando -k2 , em que 2 é coluna, então você vai ter resposta correta.

Apenas usei sort + sed

POR CIDADE

sort -k1 input_data | sed '/^$/d; s/$/\n/'

POR ALTA TEMPERATURA:

sort -k2 -nr data | sed '/^$/d; s/$/\n/'

POR BAIXA TEMPERATURA:

sort -k4 -nr data | sed '/^$/d; s/$/\n/'

Explicação:

dados classificados serão enviados para o sed

o sed irá excluir a primeira linha em branco usando /^$/d em seguida, acrescente uma nova linha após cada linha.

    
por 04.04.2013 / 07:32
0

Você tem duas opções.

  1. Crie uma nova coluna de nome classificável com os espaços removidos, classifique por essa coluna temporária / nova e, finalmente, suprima a saída dessa coluna "temporária" ou

  2. Verifique se o separador de campos não é um caractere válido em nenhum campo. Um Espaço é um caractere válido no Nome da Cidade, então você tem que usar outra coisa para o separador de campos.

A opção 1 permite um maior controle, pois você pode substituir os nomes por outros nomes, por exemplo, todos os minúsculos, números removidos, converter caracteres para outros caracteres e assim por diante, mas também o mais complexo de implementar.

A opção 2 pode ser feita assim:

#!/bin/bash
awk '{TLOW=$(NF-1); 
      THIGH=$NF; 
      $NF=""; 
      $(NF-1)="";
      gsub(" +$","");
      CITYNM=$0; 
      printf ("%s:%s:%s\n", CITYNM, TLOW, THIGH)}' | sort -t: 

Agora, a questão é como você deseja classificar um nome como "Cape Town" versus "Capelle". O comando unix sort coloca Capelle antes da Cidade do Cabo, mas isso pode às vezes não ser o que você quer, o que é quando a opção 1 entra em jogo.

    
por 04.04.2013 / 12:53

Tags