
Как вывести список всех .txt-файлов (файлы, разделенные символом вертикальной черты) и количество столбцов каждого файла в каталоге?
решение1
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
FNR == 1 {print FILENAME ": " NF; nextfile}' {} +
Напечатал бы что-то вроде
./dir/foo.txt: 2
для каждого обычного непустого файла, имя которого заканчивается на , .txt
где "2"
- количество |
полей, разделенных -, в первой строке файла.
Обратите внимание, что nextfile
это доступно не во всех awk
реализациях, но там, где это не так, это должно быть безвредно (просто менее эффективно, так как awk
будет считывать файлы полностью).
Если вы хотите рассмотреть только те файлы, которые имеют одинаковое количество столбцов во всех своих непустых строках, с помощью 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}' {} +
решение2
Другой подход для любогоawkвыполнение:
find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;
-F'|'
- рассматривать|
как разделитель полейNF{ ... }
- гарантирует, что в файле есть хотя бы одно поле/столбец.NF
Сам по себе указывает на количество столбцов
решение3
find . -name "*.txt" -type f -exec wc -l {} \;
решение4
Ваш вопрос не очень ясен, но вы можете попробовать эту команду:
find DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }"
просто замените DIRECTORY
и SEPARATOR
на ваш каталог и разделитель столбцов.