Usando o awk para mesclar 2 arquivos

1

Gostaria de mesclar 2 arquivos com base nas colunas 1, 2 e 3. Tentei o comando awk abaixo, mas não está funcionando.

awk 'NR==FNR {h[$1FS$2FS$3]=$4; next}{k=$1FS$2FS$3; if (k in h) print $1,$2,$3,$4,h[k] ;else print $1,$2,$3,$4,"NA"}1' FS=\| OFS=\| file2.txt 

arquivo1.txt:

Student1|Class 1A|27|20140804 08:16:54
Student2|Class 1B|15|20140804 10:10:10
Student3|Class 1C|17|20140804 15:02:14
Student4|Class 1D|20|20140804 18:02:14
Student5|Class 2D|10|20140804 20:02:14

arquivo2.txt:

Student1|Class 1A|27|20140805 08:16:54
Student2|Class 1B|15|20140805 10:10:10
Student4|Class 1D|20|20140805 18:02:14
Student5|Class 2D|10|20140805 20:02:14

Resultado esperado:

Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14
    
por Lee 04.08.2015 / 17:16

3 respostas

0

Tente isso. Cria um array como no seu exemplo e apenas imprime campos mesclados via END { ... } .

$ awk -F\| '{ k=$1 FS $2 FS $3; h[k] = (k in h) ? h[k]=h[k] FS $4 : $0 } END { for(x in h){printf "%s%s\n",h[x],(length(h[x])>38) ? "" : "|NA"}}' file1.txt file2.txt|sort
Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14
$
    
por 04.08.2015 / 17:56
0

Se for seguro assumir que o primeiro arquivo contém a lista completa de chaves, ou seja, alunos, você pode simplesmente fazer o acréscimo de cada registro primeiro. Então, durante END , você precisará classificar chaves, apare os valores adicionados e preencha os valores ausentes com "NA" :

$ awk -F\| '{k=$1 FS $2 FS $3;r[k]=r[k] FS $4;c[k]++}
    END{n=asorti(r,s);
        for(i=1;i<=n;i++){
            print s[i] substr(r[s[i]],1) (++c[s[i]] == ARGC ? "" : FS "NA")
        }
    }' file1.txt file2.txt
Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14

Estou usando ++c[s[i]] == ARGC , onde ARGC informa o uso do número de arquivos + 1 (sendo o comando awk ) para fazer a comparação de preenchimento de dados.

    
por 04.08.2015 / 18:32
0

Eu tentei isso e está funcionando

/usr/xpg4/bin/awk 'NR==FNR {h[$1,$2,$3]=$4; next}{print $0,($1,$2,$3) in h?h[$1,$2,$3]:"NA"}' FS=\| OFS=\| file2.txt file1.txt
    
por 04.08.2015 / 18:26