Isso parece funcionar em gawk
e mawk
:
awk -F' *[|] *' -vOFS=' | ' '
NR==FNR {a[$1]=$2;next} $2 in a {print $1, a[$2], $3}
' k2 k1
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
Eu tenho dois arquivos k1 e k2 e estou tentando mesclar os dois arquivos com base na chave comum 'Nome do livro'.
k1
John | Dreaming of Day | IEEEJournal
Akon | Dreaming of Night | ACMJournal
k2
Dreaming of Day | Fiction
Dreaming of Night | Non-Fiction
kout: deve mesclar com base no nome do livro, ou seja, Dreaming of Day
e Dreaming of Night
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
Escrevi abaixo o script awk:
awk -F"|" 'BEGIN{OFS="|"}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3"|"a[$1$2])' k1 k2
Mas parece que não funciona.
Isso parece funcionar em gawk
e mawk
:
awk -F' *[|] *' -vOFS=' | ' '
NR==FNR {a[$1]=$2;next} $2 in a {print $1, a[$2], $3}
' k2 k1
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
Acho que o motivo pelo qual não está funcionando é que o campo 2 do arquivo 1 não é igual ao campo 1 do arquivo2. Usando '|' como delimitador, o campo 1 do arquivo 2 é "Sonhando com o dia", enquanto o campo 2 no arquivo 1 é "Sonhando com o dia". Há um espaço extra antes da palavra Sonhar.
Eu tentei fazer o seu exemplo com o comando join, e não funcionou devido a esse espaço extra. Se você remover o espaço extra do campo 2 - file 1 (ou adicionar um espaço extra no campo1-file2), isso deve funcionar.
PS1: A propósito, com join (e removendo o espaço extra) você pode chegar bem perto do seu resultado desejado sem a necessidade de um "script":
join --nocheck-order -t"|" -1 2 a.txt b.txt
Saída (após remover todos os espaços extras na frente de todos |):
Dreaming of Day |John |IEEEJournal|Fiction
Dreaming of Night |Akon |ACMJournal|Non-Fiction
Você pode cortar -d '|' os campos obrigatórios
PS2: Há sempre a "maneira clássica" que funciona com seus dados (não é necessário remover espaço extra)
while IFS="|" read -r line title1 rest; do
title2=$(echo $title1)
genre=$(grep -e "$title2" b.txt |cut -f2 -d"|")
echo $line "|" $genre "|" $rest
done <a.txt
Saída:
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
Tags awk