Как объединить данные из многих файлов в один файл?

Как объединить данные из многих файлов в один файл?

У меня есть такая структура каталогов примерно для 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

Связанный контент