Contar o número de colunas em arquivos CSV e renomear se menos de 11 colunas

3

Preciso contar o número de colunas em arquivos CSV. Se for menor que 11, renomeie o arquivo anexando o sufixo .bad . Eu tentei isso, mas está aquém do que eu preciso:

head -1 myfile.csv | sed 's/[^,]//g' | wc -c

Eu preciso fazer isso para todos os arquivos em um diretório.

    
por daniel caceres 04.12.2017 / 15:37

3 respostas

5

for file in *.csv; do
    cols=$( awk -F, 'NR == 1 {print NF; exit}' "$file" )
    if [[ "$cols" -lt 11 ]]; then
        mv -v "$file" "$file.bad"
    fi
done

ou, com o bash sem awk

for file in *.csv; do
    IFS=, read -ra fields <"$file"
    if [[ "${#fields[@]}" -lt 11 ]]; then
        mv -v "$file" "$file.bad"
    fi
done
    
por 04.12.2017 / 15:43
4

Outra abordagem curta awk :

for f in *.csv; do 
    awk -F, '{ exit (NF < 11? 0:1) }' "$f" && mv "$f" "${f}.bad"
done
  • NF < 11? - se o número de campos NF for menor que 11
  • a declaração mv "$f" "${f}.bad" será executada somente se precedida awk declaração retornada exit 0 (como uma avaliação positiva)
por 04.12.2017 / 16:02
0

perl renomeia função integrada (com advertências, portanto, verifique a documentação)

perl -F, -ane '$f=$ARGV; $c=$#F+1; close ARGV; rename $f,"$f.bad" if $c<11' *.csv
  • -F, use , como separador de campos, consulte link para detalhes sobre outras opções
  • $f=$ARGV save filename
  • $c=$#F+1 obtém o número de colunas
  • close ARGV fecha o arquivo
  • rename $f,"$f.bad" if $c<11 renomeia se o número de colunas for menor que 11
por 05.12.2017 / 12:30