Если введенные вами данные настолько просты, насколько кажутся, то вот сценарий оболочки bash
, выполняющий то, в чем сценарии оболочки не годятся. :
#!/usr/bin/env bash
declare -a col2
while read col1 rest
do
IFS=, read -a col2 <<< "$rest"
for value in ${col2[*]}
do
printf "%s %s\n" "$col1" "$value"
done
done < input
Есть лучшие способы сделать это ( read -a
специфичен для bash, а не для POSIX); есть и другие способы сделать это (awk, perl). Если ваши данные более сложные (1 a, "b, c", d)
или (1 a, b \, c, d)
, то этот сценарий, вероятно, не будет работать что ты хочешь.
Количество элементов в каталоге можно подсчитать, используя
set -- *
Это устанавливает позиционные параметры ($1
, $2
и т. д. )на имена в текущем каталоге. Количество имен, до которых расширяется *
, находится в $#
. Если вы используете оболочку bash
и устанавливаете опцию оболочки dotglob
, это дополнительно будет учитывать скрытые имена.
Использование для поиска каталогов в /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
, которые содержат более 1000 имен:
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache \
-type d -exec bash -O dotglob -c '
for pathname do
set -- "$pathname"/*
if [ "$#" -gt 1000 ]; then
printf "%d\t%s\n" "$#" "$pathname"
fi
done' bash {} +
Это расширяет глобус оболочки *
в каждом найденном каталоге и выводит путь к каталогу, если в нем более 1000 имен, вместе с количеством имен. Он делает это, выполняя короткий сценарий bash
для пакетов каталогов. Сценарий будет перебирать каждую группу каталогов и для каждого из них будет расширять глобус *
внутри него, чтобы подсчитать количество записей. Оператор if
затем запускает printf
, если это необходимо.
Учтите, что если каталог содержит миллионы имен, может потребоваться некоторое время, чтобы развернуть *
глобус в этом каталоге.
В системе GNU
(export LC_ALL=C
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -print0 |
tr '\n\0' '\0\n' |
sed 's|/[^/]*$||' |
sort |
uniq -c |
sort -rn |
head |
tr '\z' '\n')
Будет перечислено 10 каталогов с наибольшим количеством записей.
Если в каталогах так много файлов, что даже их перечисление было бы слишком дорого, вы можете попытаться угадать, что это за файлы, не вводя их, глядя на их размер.
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -type d \
-size +10000000c -print -prune
Будет перечислять каталоги размером более 10 МБ и не входить в них.