diff 명령에서 숫자 빼기 기호 간의 차이를 무시하는 방법은 무엇입니까?

diff 명령에서 숫자 빼기 기호 간의 차이를 무시하는 방법은 무엇입니까?

나는 주로 행렬 형식의 숫자로 구성된 두 개의 큰 파일을 가지고 있으며 diff(또는 유사한 명령)를 사용하여 파일을 비교하고 어떤 숫자가 다른지 확인하고 싶습니다.

불행하게도 이러한 숫자 중 상당수는 부호만 다르므로 이러한 차이에는 관심이 없습니다. 나는 두 숫자의 크기가 다른 경우에만 관심이 있습니다. (즉 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

관련 정보