-
Use
join
para encontrar os campos 1st comuns e usebash
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 )
.
- Se A2 = 3 , B2 = 2 e B3 = 4 , correspondido por
-
Não tão bom GNU
sed
code para transformar cada linha do arquivo B em dois canalizadosnumgrep
comanda esse arquivo de busca A para intervalos, entãoe
valoriza os comandos. Como a lista de comandos resultante pode ter saída redundante, canalize isso paraawk
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