Acho que find
é a escolha certa:
find */ -name "result.txt" -exec bash -c 'printf "%s,%s\n" "${0%%/*}" "$(cat $0)"' {} \;
Exemplo de execução
$ echo r1 >a/b/result.txt
$ echo r2 >c/result.txt
$ tree
.
├── a
│ └── b
│ └── result.txt
└── c
└── result.txt
$ find */ -name "result.txt" -exec bash -c 'printf "%s,%s\n" "${0%%/*}" "$(cat $0)"' {} \;
a,r1
c,r2
Explicações
Este comando find
pesquisa cada arquivo dentro ou sob o diretório atual do nome result.txt
e exec
utes o comando printf
em um subshell bash
. O comando printf
imprime o nome do subdiretório, uma vírgula e o conteúdo do arquivo seguido por um \n
ewline. Se você quiser gravar essa saída em um arquivo, basta anexar, e. >final.csv
para o comando.
Ainda mais simples
é a abordagem -printf
sugerida por steeldriver :
$ find */ -name 'result.txt' -printf '%H,' -exec cat {} \;
a/,r1
c/,r2
Isso imprime uma barra adicional na primeira coluna que você pode remover facilmente canalizando a saída por meio de sed 's|/,|,|'
.
Mesclando o conteúdo do multilinha result.txt
em uma célula
Para substituir caracteres de nova linha por espaços apenas substituem cat
por sed ":a;N;\$!ba;s/\n/ /g"
em um dos comandos acima, por exemplo,
$ find */ -name "result.txt" -exec bash -c 'printf "%s,%s\n" "${0%%/*}" "$(sed ":a;N;\$!ba;s/\n/ /g" $0)"' {} \;
a,r1 r1
c,r2
Se você quiser alguma outra string como o delimitador, substitua a parte / /
por /your_delimiter/
, mas mantenha as barras.