Поскольку вы говорите о sort
, я думаю, что решение, основанное на командной строке, в порядке.
Это довольно сложное решение: я считаю, что есть что-то лучшее, но на данный момент у меня нет лучшей идеи,
Вам нужны строки, которые не соответствуют другим линиям (или удалите те, которые соответствуют).grep -v
делает это очень хорошо, и если добавлена опция -i
, это не заботится о случае.Поскольку у вас может быть много повторяющихся строк для удаления, -f
будет вашим другом, так как он позволяет указывать множество шаблонов в файле.Столько команд * nix и опций файла, которые задают -
(одну черту) в качестве имени файла, заставляют команду читать данные из стандартного ввода, а не из файла в хранилище.Подводя итог: grep -i -f - -v ~/tmp/file
будет читать файл /tmp/file
и шаблоны из стандартного ввода.Он сохранит все строки, которые не соответствуют шаблонам, и сопоставление будет выполнено независимо от регистра символов.
Теперь вам нужно создать список шаблонов, представляющий собой список повторяющихся строк.uniq
идентифицирует дубликаты соседних строк, -d
заставляет печатать дубликаты один раз, а -i
игнорирует регистр.чтобы сделать линию смежной, вы можете использовать sort
, который с опцией -f
также игнорирует регистр.Таким образом, sort -f ~/tmp/file | uniq -d -i
получить файл печатает дубликаты один раз.
Соединение обеих частей приводит к следующей команде: sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/file
.sort
группирует одни и те же строки, так что uniq
может содержать дубликаты, которые используются в качестве шаблонов для выбора строк, которые будут удалены.
Давайте рассмотрим пример.Файл ниже имеет одну букву в строке (dup
просто идентифицирует дублирующиеся строки):
a dup
b
c dup
a dup
d
C dup
e
f
c dup
A dup
Применение нашей трубы фильтров приводит к:
sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/file
a
a
A b
b a d
c -----> b ----> e
c f
C
d
e
f