나는 주로 행렬 형식의 숫자로 구성된 두 개의 큰 파일을 가지고 있으며 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