diffコマンドで数値減算記号の違いを無視するには?

diffコマンドで数値減算記号の違いを無視するには?

私は主に行列形式の数字で構成される2つの大きなファイルを持っており、diff(または同様のコマンド)を使用してファイルを比較し、どの数字が異なるかを確認したいと思います。

残念ながら、これらの数の多くは符号のみが異なるため、これらの違いには興味がありません。私は2つの数字のサイズが異なる場合にのみ興味があります。 (つまり0.523 vs. 0.623、私は欲しいがいいえ 0.523 vs. -0.523)

diffにシンボルを無視し、サイズの異なる数字だけを印刷させることはできますか?

編集:要求されたいくつかの入力例:

ファイル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

ファイル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

私のファイルがほとんどこのような形式であると仮定すると(はるかに長い場合を除き)、違いを印刷したいのですが、シンボルの場合は違いを無視します。たとえば、0.0047536対-0.0047536は関係ありませんが、0.1156119対-0.0250637を印刷したいと思います。

答え1

bashシェルが「プロセスの置き換え」(最近のesなど)を提供している場合は、次のことを試してください。

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

答え2

$ xdiff(){ diff -bu <($1 "$2") <($1 "$3"); }
$ xdiff 'sed s/-\([.0-9]\)/\1/g' file1 file2

データに対して追加の正規化を実行できます。たとえば、すべて0.01、、、.01を等しく-.0100処理します。-.01e

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

答え3

file1の同じ行にある対応するフィールドと異なる絶対値に対応するfile2の行を印刷するには、file1の行をメモリに保存して絶対値を比較します。

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;
}

ファイルに保存して実行してみてくださいawk -f /path/to/that/file file1 file2

関連情報