Como ignorar diferenças entre sinais negativos de números no comando diff?

1

Eu tenho dois arquivos grandes, consistindo principalmente de números em forma de matriz, e gostaria de usar o diff (ou comando similar) para comparar esses arquivos e determinar quais números são diferentes.

Infelizmente, muitos desses números diferem apenas por sinal, e eu não estou interessado nessas diferenças. Eu só me importo quando dois números são diferentes em magnitude. (ou seja, eu quero 0.523 vs. 0.623 , mas NÃO 0.523 vs. -0.523 )

É possível fazer o diff ignorar o sinal e imprimir apenas números diferentes em magnitude?

EDIT: Alguns exemplos de entrada, conforme solicitado:

Arquivo 1:

21   -0.0081318   0.0000000   0.0000000   0.0000000  -0.0138079
22    0.0000000   0.0000000   0.0000000   0.1156119   0.0000000
23    0.0000000   0.0047536   0.0000000   0.0000000   0.0000000

Arquivo 2:

21   -0.0081318   0.0000000   0.0000000   0.0000000   0.0032533
22    0.0000000   0.0000000   0.0000000  -0.0250637   0.0000000
23    0.0000000  -0.0047536   0.0000000   0.0000000   0.0000000

Supondo que meus arquivos sejam formatados principalmente assim (exceto muito, MUITO maior), eu quero imprimir as diferenças, mas ignoro essas diferenças quando elas estão apenas em sinal. Por exemplo, eu não ligo para 0.0047536 vs. -0.0047536, mas eu quero imprimir 0.1156119 vs. -0.0250637.

    
por johnymm 03.10.2018 / 23:18

3 respostas

3

Dado o seu shell desde "substituição de processo" (gosta recente bash es), tente

diff <(tr '-' ' ' <file1) <(tr '-' ' '<file2)
1,2c1,2
< 21    0.0081318   0.0000000   0.0000000   0.0000000   0.0138079
< 22    0.0000000   0.0000000   0.0000000   0.1156119   0.0000000
---
> 21    0.0081318   0.0000000   0.0000000   0.0000000   0.0032533
> 22    0.0000000   0.0000000   0.0000000   0.0250637   0.0000000
    
por 04.10.2018 / 10:39
1
$ xdiff(){ diff -bu <($1 "$2") <($1 "$3"); }
$ xdiff 'sed s/-\([.0-9]\)//g' file1 file2

você pode fazer outra normalização para os dados. por exemplo, para tratar todos os 0.01 , .01 , -.0100 , -.01e da mesma forma:

$ norm(){ awk '{for(i=1;i<=NF;i++){$i=$i<0?-$i:+$i};print}' "$@"; }
$ xdiff norm file1 file2
    
por 03.10.2018 / 23:58
0

Para imprimir linhas do arquivo2 cujos valores absolutos correspondentes diferem dos campos correspondentes da mesma linha no arquivo1, salve as linhas do arquivo1 na memória, compare seus valores absolutos:

function abs(x) {
  return x < 0 ? -x : x;
}

# file 1
NR == FNR {
  file1[$1]=$2" "$3" "$4" "$5" "$6
}

# file 2
NR != FNR {
  split(file1[$1], file1fields);
  if ( abs($2) - abs(file1fields[1]) ||
       abs($3) - abs(file1fields[2]) ||
       abs($4) - abs(file1fields[3]) ||
       abs($5) - abs(file1fields[4]) ||
       abs($6) - abs(file1fields[5]) )
        print;
}

Salve isso em um arquivo e execute awk -f /path/to/that/file file1 file2

    
por 04.10.2018 / 03:28