[linux] сравнить текстовые файлы

Jackill

Хочется сравнить 2 текстовых файла, но несколько необычным способом, так что стандартный diff, похоже, этого не умеет.
Ситуация такая:
в первом файле числа записаны примерно так 0.1, 0.02, 1.23
а во втором - так: 1.00E-01, 2.00E-02, 1.22999E+00
Я ищу утилиту, спосбоную без особых допиливаний понять, что, например, 0.1 и 1.00E-01 - одно и то же.
Конечно же, при этом возникнут тонкости с округлением float-чисел. Поэтому в идеале я бы хотел иметь возможность задать требуемую точность, и получить, например, что 1.23 = 1.2299E+00...
Да, в этих файлах есть ещё и текст, в котором тоже нужно искать различия.

vall

awk

Jackill

Ну, я не сомневаюсь, что это можно сделать с помощью awk. Весь diff можно на нём написать, но я ищу путь легче - может быть это кто-то уже писал. ;)

vall

я не знаю другой более простой тулзы имеющией встроенное вычисление с плавающей точкой.
дальше либо python/perl или какой-то специализированный статистический/математический софт.

apl13

я не знаю другой более простой тулзы имеющией встроенное вычисление с плавающей точкой.
dc же! :lam:

durka82

По идее нужна тулза, позволяющая задать свой критерий сравнения.

pitrik2

По идее нужна тулза, позволяющая задать свой критерий сравнения.
ну или тулза которая нормирует файл (тойсть округляет все числа к нужной точности и приводит к одному формату)
тойсть нормируешь оба файла и потом уже обычный diff

apl13

{ sudo apt-get install ghc ; } && ghc -e 'import System
import IO
epsilon = 0.0001
main = getArgs >>= sequence . map (\n -> (openFile n ReadMode >>= hGetContents >>= print . and . (\[a,b] -> zipWith (\x y -> x - y) < epsilon * (abs x && x - y) > (-epsilon) * (abs x a b) . map (map read :: String -> Float) . init) . words)' file1.txt file2.txt

Одной командой, вроде.
Я ничего не напутал? :o
Оставить комментарий
Имя или ник:
Комментарий: