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.