Compare a string em dois arquivos e mescle sua saída

1

Estou tentando obter a largura de banda do domínio de um arquivo e seus detalhes de hits de outro arquivo.

O formato dos dois arquivos é o seguinte:

  1. bandwidth.txt

    aadrivingschool.ws       2840.36M
    aaspak.org               211.57M
    aasteknik.com            1419.26M
    aatonerpk.com            14.87M
    
  2. hits.txt:

    onlinestudyboard.com   received  186     hits  from  31/May/2016  at  1201
    aaspak.org             received  184     hits  from  31/May/2016  at  1202
    khawajarubber.com      received  183     hits  from  31/May/2016  at  1246
    aatonerpk.com          received  182     hits  from  31/May/2016  at  1231
    

O que estou tentando conseguir é:

onlinestudyboard.com       received  186     hits  from  31/May/2016  at  1201 
aaspak.org                 received  184     hits  from  31/May/2016  at  1202  211.57M
khawajarubber.com          received  183     hits  from  31/May/2016  at  1246
aatonerpk.com              received  182     hits  from  31/May/2016  at  1231  14.87M
    
por blaCkninJa 31.05.2016 / 16:37

2 respostas

1

Aqui está uma abordagem awk :

$ awk 'FNR==NR{a[$1]=$2; next} {print $0,a[$1]}' bandwidth.txt hits.txt
onlinestudyboard.com     received  186     hits  from  31/May/2016  at  1201 
aaspak.org               received  184     hits  from  31/May/2016  at  1202 211.57M
khawajarubber.com        received  183     hits  from  31/May/2016  at  1246 
aatonerpk.com            received  182     hits  from  31/May/2016  at  1231 14.87M

Explicação

awk lê seu (s) arquivo (s) de entrada linha por linha e divide a linha em campos no espaço em branco (ou o que for dado por -F ). Esses campos são $1 , $ 2 ... $ N '.

  • NR==FNR : NR é o número da linha atual, FNR é o número da linha do arquivo atual. Os dois serão idênticos apenas enquanto o primeiro arquivo estiver sendo lido.
  • a[$1]=$2; next : se este for o primeiro arquivo (veja acima), salve o segundo campo em uma matriz cuja chave é o primeiro campo.
  • print $0,a[$1] : imprime a linha atual ( $0 ) e o valor na matriz a associada ao primeiro campo. Isso imprimirá a linha atual do segundo arquivo junto com qualquer valor do primeiro arquivo associado ao primeiro campo.
por 31.05.2016 / 17:13
0

Com sort ed junte-se , coluna e alguns bash _isms:

join -a 1 <(sort hits.txt) <(sort bandwidth.txt) | column -t | sort -nrk3

Três tipos são necessários. Dois porque os arquivos de entrada não são classificados por campos comuns, mas join precisava de entrada classificada. Outra classificação (3º campo, numérico reverso) é necessária para restaurar a ordem de classificação do OP.

Saída:

onlinestudyboard.com  received  186  hits  from  31/May/2016  at  1201
aaspak.org            received  184  hits  from  31/May/2016  at  1202  211.57M
khawajarubber.com     received  183  hits  from  31/May/2016  at  1246
aatonerpk.com         received  182  hits  from  31/May/2016  at  1231  14.87M

O código é mais simples quando a ordem de saída não é significativa, e os arquivos de entrada são pré-classificados:

join -a 1 hits.txt bandwidth.txt | column -t
    
por 03.06.2016 / 20:30