Ordenar por números

0

Eu preciso classificar uma lista pelo ISBN NUMBER (a terceira coluna) de um arquivo de entrada para um file.sh e enviada para um arquivo de saída ( file.out ). O arquivo de entrada ( file.input ) teria uma lista

Donald Smith,Fire Lands,97868545414459
Adam Barry,The Armies,97564325678855
Jennifer Lelan,Childhood dreams,97546766544237

usando uma estrutura em loop para processar os dados e os títulos Author Name of book ISBN .

O resultado

Author                   Name of Book               ISBN

Jennifer  Lelan    Chilhood Dreams   97546766544237
Adam Barry          The Armies             97564325678855
Donald Smith        Fire Lands              97868545414459
    
por Jonny kebell 13.06.2018 / 17:45

2 respostas

5

Primeiro de tudo, você não executará um loop sobre esses dados: Por que usar um loop de shell para processar texto considerado má prática?

Se as únicas vírgulas no arquivo forem as vírgulas que delimitam os campos,

sort -t ',' -k3n -o file.output file.input

ordenaria os dados numericamente no número na terceira coluna. A saída seria gravada em file.output .

Para os dados fornecidos, file.output seria parecido com

Jennifer Lelan,Childhood dreams,97546766544237
Adam Barry,The Armies,97564325678855
Donald Smith,Fire Lands,97868545414459

Para processar ainda mais esses dados, pode-se considerar o uso de um programa awk . Como você não especificou o tipo de processamento que gostaria de fazer, o seguinte apenas extrai os dados em variáveis (não realmente necessárias) para cada linha e as imprime:

sort -t ',' -k3n file.input |
awk -F ',' '{ author=$1; title=$2; isbn=$3;
              printf("Author: %s\nTitle: %s\nISBN: %s\n",
                     author, title, isbn) }'

Observe que, nesse caso, não é necessário armazenar os dados classificados em um arquivo intermediário.

O resultado dado os dados na pergunta:

Author: Jennifer Lelan
Title: Childhood dreams
ISBN: 97546766544237
Author: Adam Barry
Title: The Armies
ISBN: 97564325678855
Author: Donald Smith
Title: Fire Lands
ISBN: 97868545414459

Para colocar os dados em colunas com boa aparência e com traços no número ISBN, você não precisa de awk . Os usos a seguir são sed para a formatação dos números ISBN e column para formatar as colunas:

sort -t ',' -k3n file.input |
sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,---/' |
column -s ',' -t

A saída será

Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

Observe que os números do ISBN parecem um pouco complicados. Isso é porque eles têm 14 dígitos. Os números ISBN Real têm 10 ou 13 dígitos , e o código acima assume que eles são 13 dígitos (ou pelo menos 12 dígitos).

Para adicionar cabeçalhos de colunas:

sort -t ',' -k3n file.input |
{ echo 'Author,Name of book,ISBN'
  sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,---/'
} |
column -s ',' -t

Que produz

Author          Name of book      ISBN
Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

... não usando loops explícitos no shell.

    
por 13.06.2018 / 17:50
4

sort é claramente a melhor ferramenta para classificação.

Se awk for necessário, você pode usar o GNU awk:

gawk -F, '
    {line[$NF] = $0} 
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (isbn in line) print line[isbn]
    }
' file

Consulte o link e link

    
por 13.06.2018 / 17:58