Erro na comparação de arquivos - awk [duplicate]

0

Eu tenho dois arquivos file1.txt , file2.txt . Desejo selecionar registros que sejam comuns a file1.txt e file2.txt com base na coluna 2 e coluna 3 e copie-os para out.txt com coluna adicional (coluna 4 de file2.txt ).

Entrada de amostra:

file1.txt

abc 1 a f11 f13 f14 
abd 2 b f12 f14 f13  
abe 4 d f13 f16 f12 
acf 5 s f14 f15 f19

file2.txt

abc 1 a f21 f23 f24 
abd 1 b f21 f24 f23  
abe 4 d f24 f26 f22 
acf 6 s f23 f25 f29

Saída desejada

out.txt

 abc 1 a f11 f13 f14 f21
 abe 4 d f13 f16 f12 f24

Pedi um questione anteriormente sobre como trabalhar com três arquivos e extrair uma saída semelhante com base em entradas semelhantes para melhor compreensão. Eu sou novo no mundo Unix e aprendi sobre como fazer o processamento de arquivos. Com base nisso, tentei a parte de código abaixo usando awk , mas não funcionou. Alguém poderia por favor verificar e sugerir, o que deu errado?

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = 0; z[$2,$3] = $6;
    next;
}
{
    if (($2,$3) in m && m[$2,$3] == 1) {
        print $0 " " z[$2,$3] >"out.txt";
    }
}' file2.txt file1.txt
    
por Prradep 22.05.2015 / 22:15

2 respostas

1

No seu exemplo, você está criando o array m com valores 0. Você não o define como 1 e não precisa. Você pode definir o valor para a linha inteira, por exemplo, $ 0.
Tente isto:

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = $0;
    next;
}
{
    if (($2,$3) in m) {
        print m[$2,$3] " " $4 >"out.txt";
    }
}' file1.txt file2.txt
    
por 22.05.2015 / 22:33
2

awk

awk 'FNR==NR      {
                     a[$2, $3]=$4
                     next
                  }
     ($2, $3) in a{
                     print $0, a[$2, $3]
                  }
    ' file2.txt file1.txt > out.txt

junte-se

join -j 2 \
    <(sort -k2,3 file2.txt | sed 's/ /+/2') \
    <(sort -k2,3 file1.txt | sed 's/ /+/2') \
    -o 1.1,1.2,1.3,1.4,1.5,2.3 |
        sed 's/+/ /' > out.txt
    
por 22.05.2015 / 23:02