여러 파일의 데이터를 하나의 파일로 집계하려면 어떻게 해야 하나요?

여러 파일의 데이터를 하나의 파일로 집계하려면 어떻게 해야 하나요?

약 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

Stephane의 답변에 대한 변형:

$ 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

관련 정보