Вы можете проиндексировать все на user
($3
), а затем сохранить отдельные массивы для каждого из количеств, которые необходимо отслеживать. Вы можете проверить, является ли первый символ в первом поле 'd'
, чтобы определить, является ли файл каталогом, и вы можете проверить, является ли первый символ в имени файла '.'
, чтобы определить, является ли файл скрытым (решать вам. если вы хотите подсчитать каждый каталог в итоговой сумме для пользователя - если нет, добавьте и else
)
Чтобы отслеживать каждое из количеств и затем выводить в правиле END
, вы можете сделать что-то аналогично:
ls -youroptions | awk '{
user[$3]++
storage[$3]+=$5
if ($1 ~ /^d/)
dir[$3]++
if ($8 ~ /^[.]/)
hidden[$3]++
}
END {
for (i in user)
printf "user: %s\nfiles:\n(all/hidden): (%d/%d)\ndirs: %d\nstorage: %ld\n",
i,user[i],hidden[i],dirs[i],storage[i]
}'
( примечание: при разборе ls
вы, вероятно, захотите добавить NR > 1 {...}
, чтобы избежать строки "total"
, напечатанной в качестве 1-й строки, - и другие параметры и настройки LOCALE могут привести к тому, что поля полей будут отличаться от показанных вами)
Пример вывода
Использование списка, предоставленного вами в качестве ввода (при условии, что на самом деле у вас нет пустого поля) строк между каждой строкой (ls
output), будет получен следующий вывод:
user: mce237
files:
(all/hidden): (8/8)
dirs: 0
storage: 1813
Это должно показать вам один подход к обработке различных значений в отдельных массивах. с помощью общего поля в качестве индекса.