Como agrego dados de vários arquivos em um único arquivo?

Como agrego dados de vários arquivos em um único arquivo?

Eu tenho essa estrutura de diretórios para cerca de 100 usuários.

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

Dentro dos info.txtarquivos, o conteúdo fica assim.

5 some_other_info

Basicamente, é apenas uma linha, contendo um número, um espaço e, em seguida, algum texto (pode conter espaços).

Eu gostaria de criar um arquivo result.txtparecido com este.

user1 5
user2 6
user3 7
...

Onde user1, user2, user3, ... corresponde ao nome do diretório e os números correspondem ao que está em seus respectivos info.txtarquivos.

Você pode assumir que os diretórios de usuários não possuem espaços em seus nomes.

Qual é uma boa maneira de fazer isso?

Responder1

awk '{split(FILENAME,u,"/"); print u[2], $1}' users/*/info.txt

Responder2

Você pode fazer isso com um forloop simples.

{
  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

Responder3

Uma variação da resposta de Stephane:

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

O uso de (GNU) findprotege xargscontra o número de usuários que excede o número máximo de argumentos do programa (que depende do sistema).

(xargs irá dividir corretamente a entrada e chamar repetidamente awk se necessário)

Responder4

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

informação relacionada