Linux удалить повторяющиеся строки

Обновлено: 21.11.2024

Следующий тестовый файл используется в некоторых примерах, чтобы понять, как работает команда uniq.

1. Основное использование

Например, когда команда uniq запускается без каких-либо параметров, она удаляет повторяющиеся строки и отображает уникальные строки, как показано ниже.

2. Подсчитайте количество вхождений, используя параметр -c

Эта опция предназначена для подсчета количества строк в файле.

3. Печатать только повторяющиеся строки, используя параметр -d

Этот параметр позволяет печатать только повторяющиеся повторяющиеся строки в файле. Как вы видите ниже, это не отображало строку «xx», так как она не повторяется в тестовом файле.

В приведенном выше примере отображаются все повторяющиеся строки, но только один раз. Но эта опция -D будет печатать все повторяющиеся строки в файле. Например, строка «аа» встречалась в тестовом файле дважды, поэтому следующая команда uniq дважды отобразила строку «аа» в этом выводе.

4. Печатать только уникальные строки, используя параметр -u

Этот параметр предназначен для печати только уникальных строк в файле.

Если вы хотите удалить повторяющиеся строки из файла по определенному шаблону, вы можете использовать команду sed delete.

5. Ограничьте сравнение до «N» символов, используя параметр -w

Этот параметр ограничивает сравнение только первыми указанными символами «N». В этом примере используйте следующий входной файл test2.

Следующая команда uniq с параметром «w» сравнивает первые 8 символов строк в файле, а затем с использованием параметра «c» выводит количество вхождений строк в файле.

Следующая команда uniq с параметром «w» сравнивает первые 8 символов строк в файле, а затем с использованием параметра «D» печатает все повторяющиеся строки файла.

6. Избегайте сравнения первых N символов с помощью параметра -s

Эта опция пропускает сравнение первых указанных N символов. В этом примере используйте следующий входной файл test3.

Следующая команда uniq с параметром «s» пропускает сравнение первых двух символов строк в файле, а затем с использованием параметра «D» печатает все повторяющиеся строки файла.

Здесь начальные 2 символа, т.е. "aa" в 1-й строке и "xx" во 2-й строке, не будут сравниваться, а затем следующие 2 символа "bb" в обеих строках будут одинаковыми, поэтому будут отображаться как повторяющиеся строки.

7. Избегайте сравнения первых N полей с использованием параметра -f

Этот параметр пропускает сравнение первых указанных N полей строк в файле.

Следующая команда uniq с параметром «f» пропускает сравнение первых двух полей строк в файле, а затем с использованием параметра «D» печатает все повторяющиеся строки файла.

Как удалить повторяющиеся строки файла в Linux, не сортируя и не изменяя их порядок (объяснение однострочника awk).

Я только что выпустил stup, инструмент для удобного ведения ежедневных заметок в терминале. Вы можете найти его на GitHub здесь.

Предположим, у вас есть текстовый файл, и вам нужно удалить все повторяющиеся строки.

Чтобы удалить повторяющиеся строки, сохранив их порядок в файле, используйте:

Как это работает

Скрипт хранит ассоциативный массив с индексами, равными уникальным строкам файла, и значениями, равными их вхождению. Для каждой строки файла, если количество вхождений строки равно нулю, оно увеличивает их на единицу и печатает строку, в противном случае просто увеличивает количество вхождений без печати строки.

Я не был знаком с awk и хотел понять, как это делается с помощью такого короткого скрипта (awk ward). Я провел исследование, и вот что происходит:

  • «скрипт» awk !visited[$0]++ выполняется для каждой строки входного файла
  • visited[] — это переменная типа ассоциативного массива (она же Map). Нам не нужно его инициализировать, awk сделает это за нас при первом доступе к нему.
  • переменная $0 содержит содержимое строки, которая обрабатывается в данный момент
  • visited[$0] получает доступ к значению, хранящемуся на карте, с ключом, равным $0 (обрабатываемая строка), то есть к вхождениям (которые мы устанавливаем ниже)
  • ! отрицает значение вхождений:
  • При этом:
    • если visit[$0] возвращает число больше нуля, это отрицание разрешается как false .
    • если visit[$0] возвращает число, равное нулю, или пустую строку, это отрицание разрешается как true .
    • Если значение пустое, awk автоматически преобразует его в 0 (число), а затем увеличивает его.
    • Примечание: операция выполняется после того, как мы получим доступ к значению переменной.

    Подводя итог, все выражение оценивается как:

    • true, если вхождения равны нулю/пустой строке
    • false, если количество вхождений больше нуля

    Если шаблон работает успешно, выполняется связанное с ним действие. Если мы не предоставляем действие, awk по умолчанию печатает ввод.

    Пропущенное действие эквивалентно

    Наш сценарий состоит из одного оператора awk с выражением без действия. Итак:

    эквивалентен этому:

    Для каждой строки файла, если выражение успешно, строка печатается на выходе. В противном случае действие не выполняется, ничего не печатается.

    Почему бы не использовать команду uniq?

    Команды uniq удаляют только соседние повторяющиеся строки. Демонстрация:

    Другие подходы

    Использование команды сортировки

    Мы также можем использовать следующую команду сортировки, чтобы удалить повторяющиеся строки, но порядок строк не сохраняется.

    Используя cat , сортируйте и вырезайте

    Предыдущий подход создавал файл без дубликатов, строки которого сортировались бы на основе содержимого. Передав кучу команд, мы можем решить эту проблему:

    Как это работает

    Предположим, у нас есть следующий файл:

    cat -n test.txt добавляет номер заказа в начало каждой строки.

    sort -uk2 сортирует строки по второму столбцу (опция k2) и сохраняет только первое вхождение строк с одинаковым значением второго столбца (опция u)

    sort -nk1 сортирует строки по их первому столбцу (опция k1), рассматривая столбец как число (опция -n)

    Наконец, cut -f2- печатает каждую строку, начиная со второго столбца и до его конца (опция -f2-: обратите внимание на суффикс -, который указывает включить оставшуюся часть строки)

    Предположим, у вас есть текстовый файл, и вам нужно удалить все повторяющиеся строки.

    Чтобы удалить повторяющиеся строки, сохранив их порядок в файле, используйте:

    Как это работает

    Программирование и разработка

    Скрипт хранит ассоциативный массив с индексами, равными уникальным строкам файла, и значениями, равными их вхождению. Для каждой строки файла, если количество вхождений строки равно нулю, то оно увеличивает их на единицу и распечатывает строку, в противном случае просто увеличивает количество вхождений без печати строки .

    Я не был знаком с awk и хотел понять, как это можно сделать с помощью такого короткого скрипта (неудобного). Я провел исследование, и вот что происходит:

    • Сценарий awk !visited[$0]++ выполняется для каждой строки входного файла.
    • visited[] — это переменная типа ассоциативного массива (она же Map). Нам не нужно его инициализировать, потому что awk сделает это при первом доступе к нему.
    • Переменная $0 содержит содержимое строки, которая обрабатывается в данный момент.
    • visited[$0] получает доступ к значению, хранящемуся на карте, с ключом, равным $0 (обрабатываемая строка), также известным как вхождения (которые мы устанавливаем ниже).
    • ! отрицает значение вхождений:
      • В awk любое числовое значение, отличное от нуля, или любое непустое строковое значение является истинным.
      • По умолчанию переменные инициализируются пустой строкой, которая равна нулю при преобразовании в число.
      • При этом:
        • Если посещенный[$0] возвращает число больше нуля, это отрицание разрешается как ложное.
        • Если посещенный[$0] возвращает число, равное нулю, или пустую строку, это отрицание разрешается как истинное.
        • Если значение пустое, awk автоматически преобразует его в 0 (число), а затем увеличивает его.
        • Примечание. Операция выполняется после доступа к значению переменной.

        Подводя итог, все выражение оценивается как:

        • true, если вхождения равны нулю/пустой строке
        • false, если количество вхождений больше нуля

        Если шаблон работает успешно, выполняется связанное с ним действие. Если мы не предоставляем действие, awk по умолчанию печатает ввод.

        Пропущенное действие эквивалентно .

        Наш сценарий состоит из одного оператора awk с выражением без действия. Итак:

        эквивалентен этому:

        Для каждой строки файла, если выражение выполнено успешно, строка печатается на выходе. В противном случае действие не выполняется и ничего не печатается.

        Почему бы не использовать команду uniq?

        Команда uniq удаляет только соседние повторяющиеся строки. Вот демонстрация:

        Другие подходы

        Использование команды сортировки

        Мы также можем использовать следующую команду сортировки, чтобы удалить повторяющиеся строки, но порядок строк не сохраняется.

        Использование кота, сортировки и обрезки

        Предыдущий подход создавал файл без дубликатов, строки которого сортировались бы на основе содержимого. Эту проблему можно решить с помощью набора команд:

        Как это работает

        Предположим, у нас есть следующий файл:

        cat -n test.txt добавляет номер заказа в начало каждой строки.

        sort -uk2 сортирует строки по второму столбцу (опция k2) и сохраняет только первое вхождение строк с одинаковым значением второго столбца (опция u).

        sort -nk1 сортирует строки по их первому столбцу (опция k1), рассматривая столбец как число (опция -n).

        Наконец, cut -f2- печатает каждую строку, начиная со второго столбца и до его конца (опция -f2-: обратите внимание на суффикс -, который указывает на включение остальной части строки).

        Ссылки

        Это все. Фото кота.

        Эта статья изначально была опубликована Лазарусом Лазаридисом в блоге iridakos под лицензией CC BY-NC 4.0 и публикуется повторно с разрешения автора.

        7, 0

        Я делаю скрипт KSH для удаления повторяющихся строк в файле. Допустим, файл имеет формат, указанный ниже.

        и я хочу просто сделать это без повторяющихся строк, как в файле ниже.

        165, 0

        Попробуйте следующую команду:

        7, 0

        61, 0

        уникальный файл > file.new

        Если файлы еще не отсортированы, то:

        сортировать файл | уникальный > файл.новый

        25, 2

        18, 0

        Ваше решение такое простое и такое эффективное!

        Еще 10 обсуждений, которые могут вас заинтересовать

        1. Программирование оболочки и создание сценариев

        Удалить повторяющиеся строки, отсортировать их и сохранить как файл

        Привет, у меня есть CSV-файл, в котором я хотел бы удалить повторяющиеся строки на основе 1-го поля и отсортировать их по 1-му полю. Если в 1-м поле есть более 1 строки, одинаковой, я хочу сохранить первую строку из них и удалить остальные. Я думаю, что мне нужно использовать uniq или что-то в этом роде, но я все же. (8 ответов)

        Обсуждение начато: воздержаться

        2. Программирование оболочки и создание сценариев

        Удалить повторяющиеся строки из файла на основе полей

        Уважаемое сообщество, мне нужно удалить повторяющиеся строки из файла, содержащего очень большое количество строк (миллионы?) на основе 1-го и 3-го столбцов. Данные такие: Регион 23/11/2014 09:11:36 41752 Medio 23.11.2014 03:11:38 4132 Info 23.11.2014 05:11:09 4323. (2 ответа)

        Обсуждение начато: Lord Spectre

        3. Программирование оболочки и создание сценариев

        Удалить повторяющиеся строки из файла

        Здравствуйте, у меня есть CSV-файл, содержащий несколько миллионов строк. Первая строка (заголовок) повторяется на каждой 50000-й строке. Я хочу удалить все повторяющиеся заголовки из второго экземпляра (не следует удалять первую строку). Я не хочу использовать какой-либо шаблон из заголовка, поскольку он у меня есть. (7 ответов)

        Обсуждение начато: sudhakar T

        4. Программирование оболочки и создание сценариев

        Удалить повторяющиеся строки из файла размером 50 МБ

        привет, помогите пожалуйста написать команду для удаления повторяющихся строк из файла. И размер файла 50 Мб. Как удалить дубликаты линков из такого большого файла. (6 ответов)

        Обсуждение начато: vsachan

        5. Программирование оболочки и создание сценариев

        Как удалить повторяющиеся строки в этом файле?

        Привет, ребята, нужна помощь, чтобы исправить этот скрипт. Я пытаюсь удалить все повторяющиеся строки в этом файле. Я написал следующий скрипт, но он не работает. В чем проблема? Выходной файл должен содержать всего пять строк: Later! (5 ответов)

        Обсуждение начато: Ernst

        6. Программирование оболочки и создание сценариев

        Удалить повторяющиеся строки из первого файла, сравнивая второй файл

        Привет, у меня есть два файла со следующими данными:: file1:- 123|aaa|ppp 445|fff|yyy 999|ttt|jjj 555|hhh|hhh file2:- 445|fff|yyy 555|hhh|hhh Записи, присутствующие в файле 1 и отсутствующие в файле 2, должны быть записаны в выходной файл. вывод:- 123|aaa|ppp 999|ttt|jjj Есть ли одна строка. (3 ответа)

        Обсуждение начато: gani_85

        7. Программирование оболочки и создание сценариев

        удалить повторяющиеся строки из файла linux/sh

        приветствую, я надеюсь, что есть способ преобразовать файл, удалить повторяющиеся строки и отправить этот вывод в новый файл. файл всегда будет меняться, но будет примерно таким: пожалуйста, имейте в виду, что выше может быть восемь вхождений каждого имени хоста, или он может просто иметь еще четыре из. (2 ответа)

        Обсуждение начато: crimso

        8.UNIX для чайников, вопросы и ответы

        Как удалить повторяющиеся строки в файле

        Привет, пожалуйста, помогите мне, как удалить повторяющиеся строки в любом файле. У меня есть файл с огромным количеством строк. я хочу удалить выбранные строки в нем. А также, если существуют повторяющиеся строки, я хочу удалить остальные и просто сохранить одну из них. Пожалуйста, помогите мне с любыми командами unix или даже fortran. (7 ответов)

        Обсуждение начато: reva

        9. Программирование оболочки и создание сценариев

        Команда/скрипт для удаления повторяющихся строк из файла?

        Обсуждение начато: Rahulpict

        10. UNIX для чайников, вопросы и ответы

        Удалить повторяющиеся строки из файла

        У меня есть файл журнала "logreport", который содержит несколько строк, как показано ниже: 04:20:00 /usr/lib/snmp/snmpdx: Агент snmpd не работает, но ответил на ping 06:38:08 /usr/lib /snmp/snmpdx: Агент snmpd выглядел мертвым, но ответил на команду ping 07:11:05 /usr/lib/snmp/snmpdx: Агент snmpd выглядел мертвым, но. (18 ответов)

        Читайте также: