여러 파일의 데이터를 하나의 파일로 집계하는 방법은 무엇입니까?

여러 파일의 데이터를 하나의 파일로 집계하는 방법은 무엇입니까?

약 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

Stephen의 답변에 대한 변형:

$ cd users && \
      find -mindepth 2 -maxdepth 2 -type f -name info.txt  \
    | xargs awk '{ split(FILENAME,u,"/"); print u[2], $1 }'

find(GNU)는 사용자 수가 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

관련 정보