Liste todos os arquivos .txt e conte o número da coluna

Liste todos os arquivos .txt e conte o número da coluna

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

Responder1

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 regular não vazio cujo nome termina em .txtonde "2"é o número de |campos separados na primeira linha do arquivo.

Observe que nextfilenão está disponível em todas awkas implementações, mas naquelas em que não está, deve ser inofensivo (apenas menos eficiente, pois awk seria a leitura completa dos arquivos).

Se você quisesse considerar apenas os arquivos que possuem o mesmo número de colunas em todas as suas linhas não vazias, com 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}' {} +

Responder2

Outra abordagem para qualquerestranhoimplementação:

find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;

  • -F'|'- tratar |como separador de campo
  • NF{ ... }- garante que haja pelo menos um campo/coluna no arquivo. NFem si aponta para o número de colunas

Responder3

find . -name "*.txt" -type f -exec wc -l {} \;

Responder4

Sua pergunta não está muito clara, mas você pode tentar este comando: find DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }" basta substituir DIRECTORYe SEPARATORpelo seu diretório e separador de coluna.

informação relacionada