shell script ou awk script para excluir arquivos cuja primeira coluna / campo está vazia

1

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.

    
por daniel caceres 03.12.2017 / 17:56

4 respostas

1

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
    
por 03.12.2017 / 18:08
1

$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.

    
por 03.12.2017 / 18:02
0

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
    
por 03.12.2017 / 18:04
0

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
    
por 04.12.2017 / 07:31