Fala Tiagos. Não fiz esse curso então não sei bem o que ele aborda, mas posso dar uma solução pra você. O passo a passo seria:
- ler e armazenar em memória a lista de pertences
- ler a lista de pessoas e, pra cada pessoa, conferir a lista de pertences
- se o pertence for da pessoa, armazenar isso no arquivo final
Opcional: adicionar ou remover o cabeçalho.
O código abaixo vai fazer exatamente isso que eu te falei, usando as seguintes técnicas:
- declaração de array e armazenamento
- loop while pra ler cada arquivo (precisa ter uma linha final vazia)
awk
para separação de campos (opção -F
pra substituir o delimitador padrão espaço por pipe)sed
para fazer uma substituição imediata de string e armazenar em uma variável, com a opção -e
para usar expressão regularecho
com redirecionamento de saída >>
para concatenar ao arquivo de saída
#!/bin/bash
# lista de pertences (pra não ler do arquivo n vezes)
pertences=()
#_header=true
while read _line; do
#[ $_header == true ] && _header=false && continue
pertences+=("$_line")
done < pertence.psv
#_header=true
while read _pessoa; do
#[ $_header == true ] && _header=false && continue
# pega o campo "nome" da pessoa
_pessoaNome=$(echo $_pessoa | awk -F '|' '{print $1}')
# pega os "campos extras" da pessoa
_pessoaCampos=$(echo $_pessoa | sed -e 's/'$_pessoaNome'|//g')
# pra cada item na lista de pertences
for _pertence in ${pertences[*]}; do
# pega o campo "nome" do pertence
_pertenceNome=$(echo $_pertence | awk -F '|' '{print $1}')
# se os nomes forem iguais,
if [ "$_pertenceNome" == "$_pessoaNome" ]; then
# pega o campo "pertence"
_pertenceObjeto=$(echo $_pertence | awk -F '|' '{print $2}')
# concatena tudo numa nova linha do arquivo de saida
echo "$_pessoaNome|$_pessoaCampos|$_pertenceObjeto" >> saida.psv
fi
done
done < pessoa.psv
A saída desse código fica algo assim:
nome|campo2|campo3|pertence
Tiago|campo2|campo3|celular
Tiago|campo2|campo3|relogio
Rogerio|campo2|campo3|bicicleta
Se você quiser ignorar os cabeçalhos (e não imprimi-los no arquivo de saída) basta DEScomentar as linhas entre os dois while
s que utilizam a variável _header
.
É isso! Qualquer dúvida manda um toque aqui!
Ps.: essa solução é simplificada pois espera que:
- ambos os arquivos tenham cabeçalho
- que os campos de
id
sejam sempre os primeiros - os campos extra sempre existam (mesmo que vazios, como em
Tiago|valor2||valor4
) - que os arquivos de leitura estejam na pasta de onde é executado o script