Eu tenho um csv
arquivo com receitas diferentes. Desejo classificar o arquivo csv na receita de valor alto para baixo . Não consigo encontrar como fazer isso no terminal sem o uso de python.
Eu não quero usar python.
Eu quero usar algo simples como mlr
// .sed
awk
Entrada:
name,location,capital,profit-lost,revenue,employees,year
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
Saída:
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
A receita está vazia para bilhões.
Espero que alguém possa me ajudar com isso também
Usando
sort
:O
sed -u 1q
é necessário parasort
ignorar o cabeçalho. Basicamente, significa processar a 1ª linha e sair, depois passar o restante parasort
.-u
é a abreviação de--unbuffered
, para evitar processar mais do que a primeira linha.Sinalizadores de classificação:
-t,
para especificar o delimitador para uma vírgula.-r
para tornar a saída ordenada descendente. É ascendente por padrão.-n
ordenar numericamente.-k5
para classificar a 5ª chave/coluna.Demonstração:
Portanto, você deseja classificar (estavelmente) a receita em ordem numericamente decrescente, o que parece fácil em Miller, exceto que suas regras para manipulação de nulos dizem:
o que significa que eles classificam primeiro em uma classificação decrescente:
No entanto, usando o encadeamento , é fácil decorar-classificar-desdecorar com uma chave que atribui o número 0 a receitas vazias:
Usando ferramentas POSIX obrigatórias disponíveis em todos os sistemas Unix:
Veja os comentários abaixo e a cabeça pode ler mais linhas de entrada do que as saídas? para obter informações adicionais importantes sobre o script acima.
O duckdb db cli é realmente uma ótima ferramenta e é simplesmente SQL
E você consegue
MacOS tem Ruby como padrão e Ruby tem um analisador csv integrado.
Aqui está um rubi:
Ou você pode usar o GNU awk (não o awk nativo do MacOS) desta maneira:
Ou awk regular do MacOS e criar um pipe para
sort
(que é o mais rápido desses três):Qualquer uma dessas impressões:
Usando Raku (anteriormente conhecido como Perl_6)
Resumidamente, a primeira
line
(linha do cabeçalho) é lida e imediatamente descarregadaput
. Em seguida, o restante das linhas é lido. No primeiro exemplo, as linhas de valor são armazenadas no@a
array. No segundo exemplo, as linhas são classificadas diretamente. Asort
função pega um mapeador, classificando aqui as linhas que estavamsplit
em vírgulas e, em seguida, pegando a 5ª coluna (zero-index = 4). Como a classificação é normalmente em ordem crescente, o-*.
sinal negativo é usado para inverter a ordem de classificação.Exemplo de entrada:
Saída de amostra:
Para arquivos CSV mais complexos:
https://docs.raku.org/routine/lines
https://docs.raku.org/routine/split
https://github.com/Tux/CSV
https://raku.org