No caso atual, você pode simplesmente fazer:
sed 's/,,/,/g' test.csv > new.csv
Isso substituirá todas as vírgulas duplas por apenas uma, removendo efetivamente sua coluna vazia. Note que você precisará remover a coluna do cabeçalho.
Procurando por uma maneira de examinar um arquivo csv e excluir colunas, incluindo o cabeçalho que não possui valores nas linhas subseqüentes a seguir.
Talvez se eu quisesse excluir a coluna Test03 de baixo, incluindo o Test03 na primeira linha.
Test01,Test02,Test03,Test04
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44
No caso atual, você pode simplesmente fazer:
sed 's/,,/,/g' test.csv > new.csv
Isso substituirá todas as vírgulas duplas por apenas uma, removendo efetivamente sua coluna vazia. Note que você precisará remover a coluna do cabeçalho.
Se você quiser excluir colunas possivelmente não vazias (incluindo o cabeçalho), use o comando 'cut':
cut -d , -f 1,2,4 test.csv > new.csv
,,,
.
1, , ,,2
(comece com / no meio / no final). ,123
/ 123,
sed -E ':l;s/,[[:blank:]]*,/,/;tl;s/^[[:blank:]]*,|,[[:blank:]]*$//g'
o awk se junta à festa.
awk -F "," '{print $1","$2","$4}' test.csv > new.csv
Isso exige um programa em vez de um comando rápido. A melhor maneira de fazer isso seria, como sugerido por Andrew Medico, empregar um analisador de CSV apropriado (no caso de perl
você tem Text::CSV
).
No entanto, pensei em escrever um script perl
que funcionasse em casos muito simples:
perl -F, -lane 'if($.==1){@a=@F;next};for($i=0;$i<@F;$i++){if($F[$i]!=""){push @c,$F[$i];push @b,$i}}if(@a){foreach(@b){push @t,$a[$_]};print join(",",@t);undef @a}print join(",",@c);undef @c' file.csv
Isso salva a primeira linha e avança para ver se há algum campo vazio na próxima linha. Em seguida, ele imprime apenas os cabeçalhos relevantes, ignorando o campo vazio em todas as linhas.
Por favor, note que ele não suporta vírgulas dentro de strings entre aspas. No entanto, ele se transforma:
Test01,Test02,Test03,Test04
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44
para:
Test01,Test02,Test04
11,22,44
11,22,44
11,22,44
11,22,44
11,22,44
11,22,44
Ao tentar diferentes abordagens bash, eu precisava remover todas as colunas vazias (incluindo o cabeçalho) de forma confiável. Para resolver isso, usei o Python com Pandas .
import pandas as pd
data = pd.read_csv('test.csv', sep='\t')
data.dropna(axis=1).to_csv('test_clean.csv')
O importante aqui é adicionar o axis=1
para dizer ao Pandas para aplicar o dropna
a colunas em vez de linhas.
Para um usuário típico, a maneira mais fácil seria importar dados do Excel desse arquivo CSV e exportá-los novamente depois de remover a coluna.