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 ответов)
Читайте также: