Compare n nenhum dos valores de coluna entre cada registro em 2 arquivos e apenda dados do arquivo 2 para o arquivo 1

1

Eu sou novo no Unix, então queria entender como isso (mencionado abaixo) pode ser feito.

Eu tenho um arquivo de entrada como este:

Exemplo para arquivo de entrada:

a|a1|a2|a3|a4|a5|...|a29|$2342
a|a1|a2|a3|a4|a5|...|a29|$2343
a|a1|a2|a3|a4|a5|...|a29|$2344
a|a1|a2|a3|a4|a5|...|a29|$2345
b|b1|b2|b3|b4|b5|...|b29|$100
c|c1|c2|c3|c4|c5|...|c29|$12

E outro arquivo tem dados como este:

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

Estou tentando obter a saída final usando esses dois arquivos, conforme mencionado abaixo:

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2343|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2344|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2345|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

Acho que se pudermos comparar a coluna antes do valor # e se for igual, acrescente o valor do segundo arquivo ao primeiro.

Por favor ajude.

    
por mdx 15.04.2015 / 11:52

1 resposta

1

Esta é uma tarefa típica para awk . Aqui está uma solução possível:

awk '
NR==FNR {
    match($0,/.*\$/)
    pref = substr($0,RSTART,RLENGTH)
    rest = substr($0,RSTART+RLENGTH)
    suff = substr(rest, index(rest,"|"))
    suffixes[pref] = suff
    next
}
{
    match($0,/.*\$/)
    prefix = substr($0,RSTART,RLENGTH)
    match($0,/.*\$[0-9]+|/)
    data = substr($0,RSTART,RLENGTH)
    if (prefix in suffixes)
        print data suffixes[prefix]
}
' file2 file1

em que file1 é o nome "arquivo de entrada" em sua pergunta e file2 o nome "outro arquivo" em sua pergunta. (Mente a ordenação dos arquivos na lista.)

Explicação:

O primeiro bloco de comando é executado durante a leitura do primeiro arquivo file2 ; isso é obtido pela condição NR==FNR , que é válida apenas enquanto o primeiro arquivo é lido. O segundo bloco de comandos é executado apenas para o segundo arquivo file1 (por causa da diretiva next no primeiro bloco de comando). O primeiro bloco extrai o prefixo pref e o sufixo suff , e suffixes[pref] = suff memoriza para cada prefixo o sufixo correspondente; isso é necessário para se referir a esses dados no segundo bloco. No segundo bloco, existem comandos semelhantes executados para extrair o prefixo e usá-lo para obter dos sufixos armazenados o sufixo correto. Há apenas uma outra diferença; você também precisa manter o número após o símbolo # como parte de seus novos dados de prefixo, portanto, há uma segunda operação match ; para distinguir o prefixo necessário para acessar a matriz suffixes do prefixo que é necessário como parte dos dados do resultado.

    
por 15.04.2015 / 12:22

Tags