Объединить несколько файлов на различия

2

Я запускаю сценарии для текстового файла и хочу объединить его содержимое. Допустим, файл называется «file1».

file1:

Это какой-то текст, вау!

Теперь у меня есть несколько версий после запуска скриптов.

file2:

Мой <> какой-то текст, вау!

file3:

Ваш <> текст, вау!

file4:

Это какой-то текст <>, вау!

Как видите, некоторые слова заменены на другие и добавлены <>. Теперь я хочу объединить эти файлы, чтобы слова были объединены, если они изменились:

Выход:

Мой <> Твой <> это какой-то текст <>, вау!

Порядок не имеет значения; они просто должны быть объединены. Есть ли инструмент, который может сделать это легко?

MatthewRock
источник
содержимое должно быть объединено с file1..4? и как вы решаете, какое слово останется в конечном выходном файле?
Рахул
@Rahul, насколько я понимаю, все изменения находятся в конечном выводе, и что порядок не имеет значения .. для примера: My<>Yours<>может быть Yours<>My<>вместо этого
Sundeep
@Rahul да, по сути файлы 2..4 имеют то же содержимое, что и file1, но часть содержимого может быть изменена word<>; мы объединяем по правилу: если слово было изменено хотя бы в одном файле, объединить измененные версии и заменить старое слово измененной объединенной версией. Таким образом, text-> txt<>, This-> My<>Yours<>(или, как отмечено, Yours<>My<>) и some-> some. Мы можем объединить файлы 1..4 или 2..4, не имеет значения; нам ничего не понадобится из file1 (кроме оригинального заказа, если это необходимо).
MatthewRock

Ответы:

3

Я не знаю каких-либо инструментов, которые бы это делали, но это не сложно кодировать. Вот фрагмент Perl:

perl -E 'for $i (1..4) { open ($file,"<","file${i}"); { local $/; @{$words[$i]} = split " ",<$file>; }; close($file); }; for $i (0..scalar(@{$words[1]})-1) { $p=0; for $j (2..4) {  if ($words[1][$i] ne $words[$j][$i]) { print $words[$j][$i]; $p++ } } unless ($p) { print $words[1][$i] }; print " "; } print "\n"'

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

Хенрик
источник