combina duas colunas de um arquivo com três colunas de outro arquivo, imprima linhas do arquivo com duas colunas

1

Eu tenho o arquivo A com duas colunas, parece assim:

7000000185249100 162280
7000000185249048 235500
7000000185249052 755361
7000000185249068 427550
7000000185249070 269102
7000000185249081 291122

E eu tenho o arquivo B com três colunas, parece assim:

7000000185249100 1622651 1623044
7000000185249048 235104 235805
7000000185249146 2500324 2502635
7000000185249100 1218818 1221734
7000000185249468 88587 89699
7000000185249239 299691 300277
7000000185249315 769635 769986
7000000185249374 1548986 1549747

Então, o que eu queria fazer é imprimir as linhas do arquivo A

  1. se o número na primeira coluna no arquivo A corresponder ao número na primeira coluna do arquivo B e
  2. o número na segunda coluna do arquivo A está dentro do intervalo dos números na segunda e na terceira coluna do arquivo B.

A saída esperada será:

7000000185249048 235500

Eu tentei com o seguinte código, mas falhei.

awk -F '\t' 'FNR==NR{a[$1,$2,$3]=$0;next}{if(b=a[$1, >=$2 && <= $3]){print b}}' file B file A
    
por Jing 24.01.2018 / 03:27

1 resposta

0
  1. Use join para encontrar os campos 1st comuns e use bash para comparar valores:

    join --nocheck-order -j 1 A B | 
    while read a b c d ; do 
        [[ ( b -le d && b -ge c ) || ( b -le c && b -ge d ) ]] && echo $a $b
    done 
    

    A especificação OP declara " o número na segunda coluna no arquivo A é dentro do intervalo dos números na segunda e terceira colunas em arquivo B ". Esse intervalo pode não ser ordenado, então a lógica entre [[ e ]] lida com isso de qualquer maneira. Exemplo:

    • Se A2 = 3 , B2 = 2 e B3 = 4 , correspondido por ( b -le d && b -ge c ) .
    • Se A2 = 3 , B2 = 4 e B3 = 2 , correspondido por ( b -le c && b -ge d ) .
  2. Não tão bom GNU sed code para transformar cada linha do arquivo B em dois     canalizados numgrep comanda esse arquivo de busca A para intervalos, então      e valoriza os comandos. Como a lista de comandos resultante pode ter saída redundante, canalize isso para awk para executar um uniq não selecionado :

        sed -n \
        's#\(\w*\)\W*\(\w*\)\W*\(\w*\)#numgrep // A\|numgrep /..,../#e
         /./p' B |
        awk '!a[$0]++'
    

Saída de um dos métodos:

7000000185249048 235500
    
por 24.01.2018 / 04:35

Tags