Para remover os arquivos cuja primeira coluna não contém um número ou está vazia :
Abordagem simples grep
:
for f in *.csv; do grep -Eq '^(,|[^0-9])' "$f" && rm "$f"; done
Eu tenho um monte de arquivos CSV em um diretório. Quero renomear os arquivos cuja primeira coluna não contém um número ou está vazia. o novo nome do arquivo deve ser filename.bad
Eu tentei este comando awk mas não funciona.
awk '{ if (! ($1 ~ /[0-9]/)) print $1 }' *.csv .
Os arquivos são assim. Arquivo1.csv:
123,ggg,fhghgh,fhgh
345,bla,bla,bla
Arquivo2.csv:
234,bla,bla,bla
,bla,bla,bla
Este é um arquivo incorreto, pois está faltando o número, por isso deve ser renomeado & excluído.
Para remover os arquivos cuja primeira coluna não contém um número ou está vazia :
Abordagem simples grep
:
for f in *.csv; do grep -Eq '^(,|[^0-9])' "$f" && rm "$f"; done
$1
contém o conteúdo do primeiro campo, mas acho que você deseja imprimir o nome do arquivo. Além disso, por padrão, awk
assume que os campos estão separados por espaço em branco, mas você tem campos separados por vírgulas.
Podemos dizer a awk
para usar uma vírgula como separador com -F,
e no GNU awk, a variável FILENAME
que contém o nome do arquivo atual.
Em seguida, adicione o teste ao primeiro campo, digamos $1 !~ /[0-9]/
, para escolher todas as linhas em que o primeiro campo não contém um dígito ou $1 !~ /^[0-9]+$/
para escolher as linhas em que o primeiro campo está vazio ou não totalmente dígitos. (Eu não tenho certeza qual é o teste exato que você quer. Se você precisa permitir pontos decimais ou sinais de menos, você precisará ajustar.)
Então, ainda assumindo o GNU awk, algo assim deve imprimir os nomes dos arquivos que você deseja:
awk -F, '$1 !~ /^[0-9]+$/ { print FILENAME; nextfile}' *.csv
(Note que linhas totalmente vazias também irão desencadear isso, e que não funcionará se seus nomes de arquivos contiverem novas linhas.)
Em seguida, envolva-o em um loop para renomear ou remover os arquivos.
Que tal:
for f in *csv; do
awk -F, '$1!~/^[0-9][0-9]*$/{exit 1}' "$f" || echo rm -- "$f"
done
O script awk
sairá com um status de saída diferente de 0 se qualquer uma das linhas do seu arquivo de entrada tiver um campo (delimitado por vírgulas) que não seja composto inteiramente por um ou mais números. O ||
significa "faça o que está à direita se o que estiver à esquerda falhar", portanto, rm
o arquivo se o awk
sair com um status de saída diferente de 0. Remova o echo
para que ele realmente exclua os arquivos.
Como alternativa, você pode fazer apenas:
for f in *csv; do grep -q '^,' "$f" && echo rm -- "$f"; done
Portanto, se alguma linha começar com ,
, exclua o arquivo. Mas isso vai perder as linhas cujo primeiro campo não é um número. Se você também quiser, pode usar:
for f in *csv; do grep -qE '^(,|[^0-9]+),' "$f" && echo rm -- "$f"; done
Abaixo, o comando renomeia o arquivo cuja primeira coluna está vazia ou a primeira coluna não contém dígitos
Comando:
awk -F "," '$1=="" || $1 ~ !”[0-9]” {print "mv" " " FILENAME " " FILENAME".bad"}' * | sh
SE você deseja excluir os arquivos cuja primeira coluna está vazia ou a primeira coluna não contém dígitos.
awk -F "," '$1=="" || $1 ~ !”[0-9]” {print “rm -rvf” “ “ FILENAME}’ * | sh
Tags shell-script