Usando o shell script eu preciso combinar dados de dois arquivos em um arquivo

0

o arquivo 1 contém:

hour value1           
01    25               
02    24              
03    24               
04    27  
05    30

o arquivo 2 contém

hour   value2   
01     03   
03     05   
05     03

Eu quero que o resultado esteja nesta forma:

hour value1 value2   
01     25     03  
02     24     00  
03     24     05  
04     27     00  
05     30     03 
    
por dheeraj kumar 07.06.2017 / 09:18

3 respostas

5

$ join -o1.1,1.2,2.2 -a1 -e 00 file1 file2 | column -t
hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03

Com -o1.1,1.2,2.2 , especificamos quais campos de saída dessa operação de junção relacional queremos ver. O formato para isso é file_number.field_number .

Com -a1 , dizemos que gostaríamos de ter todas as linhas do primeiro arquivo, mesmo que não correspondam a nada no segundo arquivo.

Com -e 00 , dizemos que todos os valores ausentes devem ser substituídos pela string 00 .

Isso pressupõe que os dois arquivos sejam classificados da mesma maneira.

    
por 07.06.2017 / 10:28
2

Você pode usar um script Awk para fazer isso. Analise os dois arquivos ignorando os cabeçalhos, crie um hash-map de conteúdo de file2 e em file1 se o valor da coluna 1 do outro arquivo estiver presente, imprima seu valor (mais) imprima a sequência customizada 00 como você mostrou.

#!/usr/bin/env awk

BEGIN {
    printf "hour value1 value2\n"
}

NR>1 && FNR==NR {
    hash[$1]=$2; next
}

FNR>1 {
    if ($1 in hash) {
        printf "%s\t%s\t%s\n",$1,$2,hash[$1]
    } else {
        printf "%s\t%s\t%s\n",$1,$2,"00"
    }
}

Execute este script como

awk -f script.awk file2 file1
hour value1 value2
01      25      03
02      24      00
03      24      05
04      27      00
05      30      03

que deve gerar o resultado necessário.

Uma versão de linha de comando un-line legível do mesmo seria fazer,

awk 'BEGIN{printf "hour value1 value2\n"} NR>1 && FNR==NR{hash[$1]=$2; next} FNR>1 { if ($1 in hash) {printf "%s\t%s\t%s\n",$1,$2,hash[$1] } else {printf "%s\t%s\t%s\n",$1,$2,"00"} }' file2 file1
    
por 07.06.2017 / 09:48
2

Se você já classificou os arquivos de entrada (por hour field value) - considere o uso de join + awk

join --header -a1 file1 file2 | awk 'NF<3{ $0=$0 OFS "00" }1' | column -t

A saída:

hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03
  • -a1 - imprime linhas não parciais do arquivo 1

  • NF<3{ $0=$0 OFS "00" } - substitua o campo vazio não correspondido por 00

por 07.06.2017 / 10:02