Спасибо большое, ребята. Это тот кусок кода, который окончательно решил мою проблему.
nawk -v fname="${filename}" -F '/|:' '
function isnum(x){return(x==x+0)}
/P1/,/P3/{
# Found start increment i reset variables go to next line
if(/P1/){
++i
fid =""
count++
next
}
# Found end validate variable and print go to next line
if(/P3/){
printf "%s|",count
printf "%s|",isnum(fid)?fid:"NULL"
next
}
if(!fid && /36,59:*/)
{
fid = $NF
}
' ${filename} >>output.txt
Но теперь у меня есть другая проблема, для которой я создал отдельный поток.
Вот ссылка, если вы, ребята, можете помочь.
Вы можете создать массив файлов для каждого каталога отдельно, а затем просто подсчитать количество элементов. В bash
это будет что-то вроде
for dir in */*/; do a=( "$dir"/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
Если A / 001
и т. Д. Также содержит каталоги, содержимое которых вы хотите включить, тогда добавьте **
glob :
shopt -s globstar
for dir in */*/; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
Самый простой способ получить то, что вы хотите, - использовать параметр -n
для echo
при печати имени каталога. Это позволяет избежать печати новой строки в конце всего, что вы повторяете, поэтому следующий вывод остается на той же строке. Другие языки могут быть лучшим вариантом, если вы хотите собрать информацию, которую ищете, а затем выполнить несколько преобразований перед выдачей вывода.
Предполагается, что ваши имена файлов не содержат символов новой строки и ваш grep
поддерживает параметр -o:
find [[:upper:]] -type f | grep -Eo '^./[0-9]{3}' | sort | uniq -c
Это сделает то, что вы просили:
for d in */*
do
n=$(find "$d" -maxdepth 1 -type f -printf "ok\n" | wc -l)
printf "%s\t%d\n" "$d" $n
done
Основные отличия от вашего кода заключаются в том, что я использовал вместо него find
of ls
, чтобы файлы со странными именами не нарушали счетчик (подумайте о \ n
в имени файла), и что я использовал printf
для форматирования выход.
Возможно, что-то вроде:
find $PWD/ -type f -printf "%h\n\0" | uniq -zc
Результат примерно такой:
7 /foo
17 /foo/bar
9 /foo/baz
Добавить | sort -z
перед | uniq
, чтобы отсортировать его.