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.txt
arquivos, 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.txt
parecido 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.txt
arquivos.
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 for
loop 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) find
protege xargs
contra 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