Сравните 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
Это может работать для вас (GNU diff):
diff -bu file1 file2 | sed -n '1,2d;s/^+//p'
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou