Como mesclar dois arquivos com uma chave comum no awk?

2

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.

    
por Yogesh Darji 25.11.2016 / 21:31

2 respostas

3

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
    
por 26.11.2016 / 01:58
2

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
    
por 25.11.2016 / 23:31

Tags