verificação de integridade do arquivo awk. awk check for null / missing values em arquivos csv

1

Estou tentando escrever um script simples de verificação de sanidade de arquivo. Eu tenho um diretório com dezenas de arquivos CSV contendo id, edname, firstname, lastname, suffix, email.

Eu gosto de escrever um script awk para verificar se o primeiro campo contém um número e não está vazio. e os campos numéricos 3,4 & 6 não estão vazios e que o arquivo contém 6 campos não mais que não 6, se todas essas condições forem verdadeiras, nada acontece, mas se qualquer uma dessas condições falhar, renomeie o arquivo para .bad. aqui está o que eu tenho, mas não está pegando valores em falta nas colunas 4,6.

for f in *.csv; do 
  awk -F, '!(NF==6 && $1+0==$1 && $3$4$6!=""){f=1; exit} END{exit f}' "$f" || mv "$f" "$f".bad;
done
    
por daniel caceres 07.12.2017 / 19:26

2 respostas

2

Como apontou a Steeldriver nos comentários, seu terceiro teste será verdadeiro se algum dos três campos não estiver vazio. Eu suponho que você realmente quer algo assim:

for f in *.csv; do 
  awk -F, '!(NF==6 && $1+0==$1 && $3!="" && $4!="" && $6!=""){f=1; exit} 
            END{exit f}' "$f" || mv "$f" "$f".bad;
done
    
por 07.12.2017 / 20:13
1

Não é necessário fazer comparações de strings se você quiser apenas garantir que não seja nulo. As strings vazias são falsas, então:

awk -F, 'BEGIN {flag=0} !(NF==6 && $1+0==$1 && $3 && $4 && $6) {flag=1} END {exit flag}'
    
por 07.12.2017 / 20:11

Tags