Как насчет:
cat file1 file2
| awk '{print $1" "$2" "$3}'
| sort
| uniq -c
| grep -v '^ *1 '
| awk '{print $2" "$3" "$4}'
Предполагается, что вас не слишком беспокоит пустое пространство между полями (другими словами, три табуляции и пробел ничем не отличаются от пробела и 7 табуляций). Это обычно тот случай, когда вы говорите о полях в текстовом файле.
То, что он делает, выводит оба файла, удаляя последнее поле (поскольку вы не заботитесь об этом с точки зрения сравнений). Он сортирует так, чтобы похожие строки были смежными, а затем унифицирует их (заменяет каждую группу смежных идентичных строк одной копией и количеством).
Затем он избавляется от всех тех, у кого был один счет (без дубликатов), и распечатывает каждый из них со снятым счетом. Это дает вам ваши «ключи» к дублирующимся строкам, и вы можете использовать другую итерацию awk, чтобы найти эти ключи в файлах, если хотите.
Этот не будет работать должным образом, если два идентичных ключа находятся только в одном файле, поскольку файлы объединяются на ранней стадии. Другими словами, если у вас есть дубликаты ключей в file1
, но не в file2
, это будет ложное срабатывание.
Тогда единственное реальное решение, которое я могу придумать, - это решение, которое проверяет file2
для каждой строки в file1
, хотя я уверен, что другие могут придумать более умные решения.
И для тех, кто любит немного садомазохизма, вот вышеупомянутое не слишком эффективное решение:
cat file1
| sed
-e 's/ [^ ]*$/ "/'
-e 's/ / */g'
-e 's/^/grep "^/'
-e 's/$/ file2 | awk "{print \\$1\\" \\"\\$2\\" \\"\\$3}"/'
>xx99
bash xx99
rm xx99
Этот файл создает отдельный файл сценария для выполнения работы. Для каждой строки в file1
в скрипте создается строка для поиска в file2
. Если вы хотите посмотреть, как это работает, просто посмотрите на xx99
, прежде чем удалить его.
И в этом случае пробелы имеют значение, поэтому не удивляйтесь, если они не будут работать для строк, где пробелы различаются между file1
и file2
(хотя, как и в большинстве "отвратительных" сценариев, это можно исправить с помощью еще одной ссылки в конвейере). Это еще один пример ужасных вещей, которые вы можете создать для быстрых и грязных работ.
Это , а не , что я бы сделал для кода производственного качества, но это хорошо для разового, при условии, что вы уничтожите все свидетельства до того, как Daily WTF узнает о это: -)