複数のファイルからデータを 1 つのファイルに集約するにはどうすればよいですか?

複数のファイルからデータを 1 つのファイルに集約するにはどうすればよいですか?

約 100 人のユーザー用にこのディレクトリ構造があります。

users
- user1
  - info.txt
- user2
  - info.txt
- user3
  - info.txt
...

ファイル内のinfo.txt内容は次のようになります。

5 some_other_info

基本的に、数字、スペース、テキスト(内部にスペースが含まれる場合があります)を含む 1 行のみです。

result.txt次のようなファイルを作成したいと思います。

user1 5
user2 6
user3 7
...

ここで、、、、user1...はディレクトリ名と一致し、数字はそれぞれのファイルの内容と一致します。user2user3info.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) を使用するとfindxargsプログラム引数の最大数 (システムによって異なります) を超えるユーザー数から保護されます。

(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

関連情報