Listar todos os arquivos .txt e contar o número da coluna

3

Como listar todos os arquivos .txt (arquivo delimitado por pipe) e o número de colunas de cada arquivo em um diretório?

    
por Srijith A.H 21.11.2017 / 13:43

4 respostas

5
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
  FNR == 1 {print FILENAME ": " NF; nextfile}' {} +

imprimiria algo como

./dir/foo.txt: 2

para cada arquivo normal não vazio cujo nome termina em .txt , em que "2" é o número de campos | -separados na primeira linha do arquivo.

Observe que nextfile não está disponível em todas as implementações de awk , mas naquelas em que não é, deve ser inofensivo (apenas menos eficiente, pois awk leria os arquivos totalmente).

Se você quiser considerar apenas os arquivos que possuem o mesmo número de colunas em todas as linhas não vazias, com o GNU awk :

find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
  BEGINFILE {n = 0}
  NF {
    if (n && NF != n) {
      print "skipping "FILENAME" ("NF" != "n")" > "/dev/stderr"
      n = 0; nextfile
    }
    n = NF
  }
  ENDFILE {if (n) print FILENAME ": " n}' {} +
    
por 21.11.2017 / 14:05
2

Outra abordagem para qualquer implementação do awk :

find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;
  • -F'|' - trata | como separador de campos
  • NF{ ... } - garante que haja pelo menos um campo / coluna no arquivo. NF aponta para o número de colunas
por 21.11.2017 / 14:12
0
find . -name "*.txt" -type f -exec wc -l {} \;
    
por 21.11.2017 / 14:00
0

Sua pergunta não é muito clara, mas você pode tentar este comando: %código% basta substituir find DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }" e DIRECTORY pelo seu separador de diretórios e colunas.

    
por 21.11.2017 / 13:56

Tags