У меня есть такая структура каталогов примерно для 100 пользователей.
users
- user1
- info.txt
- user2
- info.txt
- user3
- info.txt
...
Внутри info.txt
файлов содержимое выглядит следующим образом.
5 some_other_info
По сути, это всего лишь одна строка, содержащая число, пробел, а затем какой-то текст (может содержать пробелы внутри).
Я хотел бы создать файл result.txt
, который выглядит примерно так.
user1 5
user2 6
user3 7
...
Где user1
, user2
, user3
, ... соответствует имени каталога, а числа соответствуют содержимому соответствующих info.txt
файлов.
Можно предположить, что в именах пользовательских каталогов нет пробелов.
Как лучше всего это сделать?
решение1
awk '{split(FILENAME,u,"/"); print u[2], $1}' users/*/info.txt
решение2
Это можно сделать с помощью простого for
цикла.
{
for userd in users/*/; do
if [[ -e "$userd/info.txt" ]]; then
read num _ < "$userd/info.txt"
printf '%s %s\n' "$user" "$num"
fi
done
} > out.txt
решение3
Вариант ответа Стефана:
$ cd users && \
find -mindepth 2 -maxdepth 2 -type f -name info.txt \
| xargs awk '{ split(FILENAME,u,"/"); print u[2], $1 }'
Использование (GNU) find
защищает xargs
от превышения числом пользователей максимального числа аргументов программы (которое зависит от системы).
(xargs правильно разделит ввод и повторно вызовет awk при необходимости)
решение4
for f in users/*/info.txt; do
set -- $(< $f)
num=$1
# choose one of:
user=$(basename $(dirname $f))
# or
dir=${f%/*}; user=${dir##*/}
echo $user $num
done