
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 .txt
onde "2"
é o número de |
campos separados na primeira linha do arquivo.
Observe que nextfile
não está disponível em todas awk
as 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 campoNF{ ... }
- garante que haja pelo menos um campo/coluna no arquivo.NF
em 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 DIRECTORY
e SEPARATOR
pelo seu diretório e separador de coluna.