Сравните 2 одинаковых файла и выведите только различия, сохранив порядок, в котором они встречаются?

Надеясь, что кто-то может помочь мне разобраться с этим

У меня есть 2 файла, один длиной 325 строк, один длиной 361 строк.

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

Файлы содержат повторяющийся абзац примерно из 31 строки - я знаю первую и последнюю строку этого абзаца, и у меня нет проблем с удалением всего абзаца, но я не могу понять, как.

то есть File1

The quick brown
fox jumped 
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog

то есть File2

The quick brown
fox jumped
over the
lazy dog
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
The quick brown
fox jumped
over the
lazy dog
djakdjhgmv
asdjkljkgfyiyi
The quick brown
fox jumped
over the
lazy dog
jghytpuptou

Мне нужно вывести только лишние строки в следующем порядке:

sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou

Любая помощь или совет будут с благодарностью приняты, к сожалению, я не *nix человек:(Я пробовал несколько выражений diff и выражений comm, но не могу получить то, что мне нужно.

4 ответа

Попробуйте эту магическую команду:

diff file1.txt file2.txt | sed -n 's/^> \(.*\)/\1/p'

diff file1.txt file2.txt должен вывести что-то вроде

2c2
< fox jumped 
---
> fox jumped
4a5,7
> sadhasdgh
> qyyutrytkdaslksad
> utyiuiytiuyo
8a12,13
> djakdjhgmv
> asdjkljkgfyiyi
12a18
> jghytpuptou

sed -n 's/^> \(.*\)/\1/p' должны найти строки, начинающиеся с > и выводить эти строки без >, Возможная причина, почему это не работает, - это разный вывод diff в вашей системе?

Это должно работать -

awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2

Explaination:

NR а также FNR являются awk's built-in variables, NR регистрирует количество записей и не сбрасывается 0 при работе с двумя файлами. FNR похож на NR но сбрасывается на 0 после того, как файл полностью проанализирован.

В этом awk один лайнер, мы соблюдаем это условие NR==FNR который должен заставить действия {a[$0]++;next} только в файле1 (как NR==FNR будет только до тех пор, пока мы не будем работать с file1). Это действие сохраняет каждую строку в array, next добавляется так, чтобы second action не вызывается. Однажды это NR==FNR становится untrue, first action никогда не называется. awk движется к second action который должен проверить содержание file2 с уважением к array (т.е. file1). Если содержание file2 находится в arrayМы игнорируем это. Если его нет в массиве, мы печатаем его, так как эти строки будут лишними и только в file2,

Тестовое задание:

File1:

[jaypal:~/Temp] cat file1
The quick brown
fox jumped 
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog

File2:

[jaypal:~/Temp] cat file2
The quick brown
fox jumped
over the
lazy dog
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
The quick brown
fox jumped
over the
lazy dog
djakdjhgmv
asdjkljkgfyiyi
The quick brown
fox jumped
over the
lazy dog
jghytpuptou

Исполнение:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
diff -b sample.log sample.log.1 | awk '/>/ {print $2}'

Это может работать для вас (GNU diff):

diff -bu file1 file2 | sed -n '1,2d;s/^+//p'
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
Другие вопросы по тегам