Создание * красиво * отформатированного списка количества файлов в каталогах - вероятно, awk и sed

Спасибо большое, ребята. Это тот кусок кода, который окончательно решил мою проблему.

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

Но теперь у меня есть другая проблема, для которой я создал отдельный поток.

Вот ссылка, если вы, ребята, можете помочь.

https://stackoverflow.com/questions/24277167/finding-and-replacing-text-inside-awk-block?noredirect=1#comment37509363_24277167

1
28.06.2017, 22:02
5 ответов

Вы можете создать массив файлов для каждого каталога отдельно, а затем просто подсчитать количество элементов. В 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
0
27.01.2020, 23:36

Самый простой способ получить то, что вы хотите, - использовать параметр -n для echo при печати имени каталога. Это позволяет избежать печати новой строки в конце всего, что вы повторяете, поэтому следующий вывод остается на той же строке. Другие языки могут быть лучшим вариантом, если вы хотите собрать информацию, которую ищете, а затем выполнить несколько преобразований перед выдачей вывода.

0
27.01.2020, 23:36

Предполагается, что ваши имена файлов не содержат символов новой строки и ваш grep поддерживает параметр -o:

find [[:upper:]] -type f | grep -Eo '^./[0-9]{3}' | sort | uniq -c
2
27.01.2020, 23:36

Это сделает то, что вы просили:

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 для форматирования выход.

0
27.01.2020, 23:36

Возможно, что-то вроде:

find $PWD/ -type f -printf "%h\n\0" | uniq -zc

Результат примерно такой:

  7 /foo
 17 /foo/bar
  9 /foo/baz

Добавить | sort -z перед | uniq , чтобы отсортировать его.

0
27.01.2020, 23:36

Теги

Похожие вопросы