Considere estes dados:
#!/usr/bin/env bash
cat > example_file.txt <<EOL
group, value, price
1, 3.21, 3.21
1, 3.42, 4.11
1, 3.5, 1.22
2, 4.1, 9.2
2, 4.2, 2.11
EOL
Eu quero mover a coluna 'valor' na frente:
value, price, group
3.21, 3.21, 1
3.42, 4.11, 1
3.5, 1.22, 1
4.1, 9.2, 2
4.2, 2.11, 2
o problema é: a ordem da coluna (ou mesmo o número da coluna ou o nome de muitas dessas colunas - exceto 'valor' que está sempre lá) varia de arquivo para arquivo. Portanto, tenho que selecionar a coluna de valor por nome (não por ordem).
Como posso fazer isso?
Com o grande Miller ( http://johnkerl.org/miller/doc ) é muito fácil
Você tem
Observação: editei meu comando, levando em consideração os espaços nos campos nome da pergunta CSV
Se você não se importa que a
value
coluna seja duplicada, você pode fazer algo assim, comcsvtool
:No entanto, até onde eu sei
csvtool
, não moverá (ou removerá ) um arquivonamedcol
.Se você não conseguir encontrar uma ferramenta CSV especializada, você pode criar a sua própria usando uma linguagem de uso geral, como Awk ou Perl. A ideia seria pesquisar os campos da primeira linha pelo índice da coluna correspondente e, em seguida, dividir os campos na ordem escolhida.
Por exemplo, usando o módulo perl Text::CSV , e este truque Como obter o índice de um elemento específico (valor) de uma matriz?
Minha sugestão é o seguinte roteiro:
Vamos chamar o script
reorder.sh
. Para ilustrar as capacidades do script vamos supor que existem os seguintes arquivos que queremos processar e eles estão localizados no mesmo diretório onde está nosso script.Processe um arquivo de entrada:
Processe dois arquivos de entrada e altere o rótulo da coluna que deve se tornar a primeira coluna para
price
:Processe todos os arquivos no diretório:
Processe recursivamente:
Usá
csvtool
-lo pode ser feito com um pequeno wrapper de script de shell:O wrapper aqui descobre em que posição a coluna de valor está, no cabeçalho (contando vírgulas antes do valor). Em seguida, ele usa o
csvtool
comando para reorganizar as colunas emvalue, <columns before>, <columns after>
.