Если строки идентичны, и вы хотите знать только , есть ли дополнительные строки в том или ином файле, вы можете использовать sort & diff (и Process Substitution здесь):
$ diff -B <(sort v1.tcl) <(sort v2.tcl) 2c2,3 < foo1 --- > foo2 > goodbye2
С помощью различий -B
игнорировать пустые строки. Затем вы можете использовать, grep -n [pattern] file
чтобы найти какую линию шаблона находится (возможно, с одним или комбинацией grep
, cut
, sed
, awk
), если это имеет значения.
Вот более полный ответ, показывающий номер файла и строки, содержащие совпадения. Не использует sed или awk, просто bash, cut, grep ... вот все (по существу) в одну строку:
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line; do if \ echo "$line" | grep -q "^<"; then grep -F -n -H \ "$(echo "$line"|cut -c3-)" v1.tcl ; elif echo "$line" | grep -q \ "^>"; then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl ; fi done
Или разбить на несколько строк:
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line do if echo "$line" | grep -q "^<" then grep -F -n -H "$(echo "$line"|cut -c3-)" v1.tcl elif echo "$line" | grep -q "^>" then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl fi done
И в зависимости от ваших входных файлов (особенно если у вас есть строки с завершающими обратными слешами), я использую эти параметры для чтения и grep:
read -r
не допускайте обратной косой черты, чтобы избежать каких-либо символовgrep -F
Интерпретировать PATTERN как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любой из которых должен соответствовать
Кроме того, используя комментарии Pimp Juice IT, если в исходных файлах есть обратная косая черта в конце, то grep выдает ошибку «file: line Trailing backslash». Использование -F
опции grep для очистки ошибки обратной косой черты приводит к гораздо меньшему решению только для grep:
grep -FvHn -f v2.tcl v1.tcl ;grep -FvHn -f v1.tcl v2.tcl
Использованные параметры grep:
-f
Получить шаблоны из файла, по одному на строку.-F
Интерпретировать PATTERN как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любой из которых должен соответствовать-v
Инвертируйте смысл соответствия, чтобы выбрать несовпадающие строки.-H
Напечатайте имя файла для каждого совпадения-n
Приставьте каждую строку вывода к номеру строки на основе 1 в своем входном файле.