У меня есть ссылки в виде текстового файла с длинным списком записей, и у каждого есть два (или более) поля.
Первый столбец - это URL ссылки; второй столбец - это заголовок, который может немного отличаться в зависимости от того, как была сделана запись. То же самое для третьего поля, которое может присутствовать или не присутствовать.
Я хочу идентифицировать, но не удалять записи, в которых первое поле (URL ссылки) идентично. Я знаю, sort -k1,1 -u
но это автоматически (не в интерактивном режиме) удалит все, кроме первого попадания. Есть ли способ просто дать мне знать, чтобы я мог выбрать, какой сохранить?
В приведенной ниже выдержке из трех строк, которые имеют одинаковое первое поле ( http://unix.stackexchange.com/questions/49569/
), я хотел бы сохранить строку 2, потому что она имеет дополнительные теги (sort, CLI) и удалить строки # 1 и # 3:
http://unix.stackexchange.com/questions/49569/ unique-lines-based-on-the-first-field
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field sort, CLI
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field
Есть ли программа, помогающая идентифицировать такие «дубликаты»? Затем я могу вручную очистить, удалив лично строки 1 и 3?
источник
Ответы:
Если я понимаю ваш вопрос, я думаю, что вам нужно что-то вроде:
или:
где
file.txt
находится ваш файл, содержащий данные о вас интересуетВ выходных данных вы увидите количество строк и строк, где первое поле найдено два или более раз.
источник
cut -d " " -f1 file.txt | uniq -d
дает хороший вывод.Это классическая проблема, которую можно решить с помощью
uniq
команды.uniq
может обнаруживать дубликаты последовательных строк и удалять дубликаты (-u
,--unique
) или сохранять только дубликаты (-d
,--repeated
).Поскольку порядок дублирования строк не важен для вас, вы должны сначала отсортировать его. Затем используйте
uniq
для печати только уникальные строки:Существует также опция
-c
(--count
), которая печатает количество дубликатов для этой-d
опции. Смотрите страницу руководстваuniq
для деталей.Если вы действительно не заботитесь о деталях после первого поля, вы можете использовать следующую команду, чтобы найти дубликаты ключей и напечатать для них каждый номер строки (добавьте другую,
| sort -n
чтобы выходные данные были отсортированы по строке):Поскольку вы хотите видеть повторяющиеся строки (используя первое поле в качестве ключа), вы не можете напрямую использовать
uniq
. Проблема, которая усложняет автоматизацию, состоит в том, что части заголовка могут различаться, но программа не может автоматически определить, какой заголовок следует считать окончательным.Вот скрипт AWK (сохраните его
script.awk
), который принимает ваш текстовый файл в качестве входных данных и печатает все повторяющиеся строки, чтобы вы могли решить, какие из них удалить. (awk -f script.awk yourfile.txt
)источник
-w
(--check-chars
) для ограничения фиксированным количеством символов, но, как видно из вашего примера, у вас есть переменные первые поля. Посколькуuniq
выбор полей не поддерживается, необходимо использовать обходной путь. Я включу пример AWK, так как это проще.-w
но длина первого поля является переменной :(Если я правильно прочитал, все, что вам нужно, это что-то вроде
Это выведет номер строки, содержащей дубликаты, и саму строку. Например, используя этот файл:
Это произведет этот вывод:
Чтобы напечатать только номер строки, вы можете сделать
И распечатать только строку:
Объяснение:
awk
Сценарий просто печатает первое пространство , отделенное поле файла. Используйте$N
для печати N-го поля.sort
сортирует его иuniq -c
подсчитывает вхождения каждой строки.Затем он передается в
while
цикл, который сохраняет число вхождений как$num
и строку как$dupe
и если$num
больше единицы (поэтому он дублируется хотя бы один раз), он будет искать файл для этой строки, используя-n
для печати номер строки. Это--
говоритgrep
о том, что то, что следует, не является параметром командной строки, полезно, когда$dupe
можно начинать с-
.источник
Без сомнения, самый многословный в списке, возможно, будет короче:
дает на текстовый файл, как:
вывод как:
После того, как вы выбрали строки для удаления:
источник
Смотрите следующее отсортировано
file.txt
:Поскольку список короткий, я вижу (после сортировки), что есть три набора дубликатов.
Тогда, например, я могу выбрать:
скорее, чем
Но для более длинного списка это будет сложно. Основываясь на двух ответах, один из которых предлагает,
uniq
а другой предлагаетcut
, я обнаружил, что эта команда дает мне вывод, который я хотел бы:источник
cut
. Если вы выполняете дедупликацию, номера строк могут быть очень полезны. Чтобы распечатать все дубликаты, используйте-D
параметр вместо-d
.for dup in $(cut -d " " -f1 file.txt | uniq -d); do grep -n $dup file.txt; done
как в моем ответе. Это даст вам лучший предварительный просмотр того, что вас интересует.Ее, как я это решил:
file_with_duplicates:
Файл сортируется и выводится по столбцам 1 и 2:
Файл отсортирован только по столбцам 1 и 2:
Показать только разницу:
источник