2014-06-01 9 views
-3

Предполагая, что у меня есть два текстовых файла на первогоFinding количество вставок, удалений и изменения между двумя файлами Unix

apple 
orange 
pineapple 
banana 
watermelon 

второго

apple 
grape 
orange juice 
pineapple 
watermelon 

Таким образом, мы видим, что виноград был добавлено, банан был удален, а оранжевый был заменен на апельсиновый сок. Основной результат, который я хочу получить, это одно изменение произошло, потому что оранжевый был изменен на апельсиновый сок.

Любая помощь будет оценена по достоинству.

+0

Я думаю, вы могли бы утверждать, что банан изменился, если вы сравниваете линию с линией? Но я на самом деле этого не ищу. Я предполагаю, что, как я вижу, это может сбивать с толку, потому что я смотрю только на содержимое, а не по строкам. – user3089610

ответ

2

Просто используйте команду diff.

$ diff f1 f2 
2c2,3 
< orange 
--- 
> grape 
> orange juice 
4d4 
< banana 
+0

... и используйте [diffstat] (http://invisible-island.net/diffstat/), чтобы подвести итоги. – reinierpost

2
perl -lne' 
    BEGIN{ 
    $x = pop; 
    ($r)= map { chomp; tr/\n/|/; qr/$_/ } do{ local $/; <> }; 
    @ARGV = $x; 
    } 
    print "$1 has been changed to $_" if /($r)/ and $1 ne $_; 
' file1 file2 

выход

orange has been changed to orange juice 

Объяснение:

Он читает file1 сразу в BEGIN блоке, удаляет символ новой строки, а остальные из них заменяет |, что делает регулярное выражение ИЭ , $r= qr/apple|orange|pineapple|banana|watermelon/

Затем файл2 считывается по строкам и проверяется, соответствует ли оно $r regex. Если это так, но захваченный $1 отличается от всей строки, он выводит уведомление об этом.

+0

+1: Приятно, мне все еще трудно понять это. Я сделал попытку, но, похоже, она не так хороша, как эта. –

+1

@jaypal он использует регулярное выражение для проверки второго файла, проверьте его. –

Смежные вопросы