Estou usando o git bash, então acho que não há problema em fazer perguntas no fórum do Unix, mas não estou familiarizado com o Unix, só uso ls
, find
e grep
, então, por favor, me corrijam se eu estiver errado.
Tenho centenas de .csv
arquivos e cada um pode ter até várias centenas de linhas. Agora, gostaria de remover as linhas csv vazias -- por linhas csv vazias, não estou me referindo a linhas com apenas espaços em branco, mas linhas todas com vírgulas ( ,,,
).
Por exemplo, um arquivo csv tem conteúdo como
Header2,Header3,Header5,Header7
a,b,c,d
,,,
aa,bb,cc,dd
,,,
,,,
aaa,bbb,ccc,ddd
,,,
,,,
,,,
, há centenas de linhas no arquivo, gostaria de atualizá-lo para
Header2,Header3,Header5,Header7
a,b,c,d
aa,bb,cc,dd
aaa,bbb,ccc,ddd
E há centenas desses arquivos, observe que nem todos os arquivos csv devem ser atualizados. Atualmente, estou usando vimgrep RegExPattern folders
o comando do editor vim, que filtra os arquivos csv de destino por padrão de expressão regular, verificando seu conteúdo, por exemplo, /,Header5,/
para filtrar apenas arquivos csv com Header5
; então, usarei cdo g/RegExPattern/d | update | edit #
o comando que pode executar uma substituição de expressão regular em cada arquivo encontrado, por exemplo, aqui eu uso cdo g/\v^,*$/d
para excluir linhas apenas com vírgulas.
No entanto, o Vim substitui e registra cada remoção de linha, pois pode haver centenas de correspondências em um arquivo e há centenas de arquivos .csv, o que é bem lento.
Existe uma maneira de realizar essa tarefa no Unix?
Não é infalível, pois pode haver arquivos como:
Onde
,,,
há um falso positivo e"","","",""
um falso negativo.Mas você pode excluir as linhas que não contêm caracteres diferentes
,
de:Onde
grep
encontra os arquivos com pelo menos uma linha que não contém um caractere diferente de,
,xargs
passa o resultado parased
esed
os editai
no nplace para remover as linhas que não contenham um caractere diferente de,
.Embora
grep
,xargs
,sed
sejam comandos Unix, aqui usamos extensões GNU não padrão (-r
,-Z
,--include
,i
;-r
-0
foram adicionadas recentemente à especificação POSIX dexargs
).Vamos supor que todos os seus arquivos .csv estejam no diretório atual. Vamos supor ainda que suas linhas 'vazias' alvo sejam sempre múltiplas vírgulas sem nada entre elas. Você pode então usar algo como isto para remover linhas 'vazias' de todos esses arquivos: