Excluir coluna vazia do arquivo csv com script bash

2

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  
    
por user1988900 07.05.2014 / 08:05

7 respostas

0

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.

    
por 07.05.2014 / 10:12
0

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
    
por 07.05.2014 / 19:24
0
  • Se colunas vazias repetidas ,,, .
  • Se as colunas em espaços em branco forem 1, , ,,2 (comece com / no meio / no final).
  • Se estiver vazio no início ou no final de uma linha ,123 / 123,
sed -E ':l;s/,[[:blank:]]*,/,/;tl;s/^[[:blank:]]*,|,[[:blank:]]*$//g'
    
por 20.10.2017 / 09:55
0

o awk se junta à festa.

awk -F "," '{print $1","$2","$4}' test.csv > new.csv
    
por 20.10.2017 / 11:29
0

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
    
por 27.10.2017 / 13:11
0

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.

    
por 03.08.2018 / 10:41
0

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.

    
por 04.11.2018 / 18:53

Tags