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

У меня есть длинный файл CSV с двумя столбцами, который включает в себя прогон последовательных дубликатов:

... 1500,1533 1554,1678 1554,1703 1554,1728 1593,1766 ... 

Мне нужно удалить все эти дубликаты, кроме последнего, так что вывод для примера выше:

 ... 1500,1533 1554,1728 1593,1766 ... 

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

Я попробовал tac file.csv | sort -k1,1 -r -u -t, tac file.csv | sort -k1,1 -r -u -t,

но это не дало желаемого результата, а функции сортировки перепутали мой порядок строк.

3 Solutions collect form web for “Удалите последовательные строки в CSV с повторяющимися значениями в одном поле, но сохраните последнюю строку”

С sed :

 sed '$!N;/\(.*,\).*\n\1/!P;D' infile 

N означает, что в пространстве шаблонов всегда есть две последовательные строки, а sed P – первый из них, только если первое поле в этой строке не совпадает с первым полем во второй строке. Затем D удаляет первую строку из пространства шаблонов и перезапускает цикл.


Другой способ с gnu datamash (если ваш файл отсортирован, так как datamash требует отсортированного ввода):

 datamash -t ',' -g 1 last 2 <infile 

Это g объединяет ввод с разделителями по 1 -ому полю, распечатывая только last значение (из 2 го столбца) каждой группы.


Если ваш файл не отсортирован, datamash может сортировать его через -s :

 datamash -t ',' -s -g 1 last 2 <infile 

но это означает, что начальный порядок строк не будет сохранен. Так что это может не делать то, что вы хотите. В этом случае вы можете использовать sed / awk / perl т. Д. …

И альтернативный awk:

  awk -F, 'NR==1{old=$0;check=$1}NR>1 && $1 != check {print old}{old=$0;check=$1}END{print old}' knovice 1500,1533 1554,1728 1593,1766 

Вот еще один awk подход (спасибо @Glenn ):

  tac file | awk -F, 'awk -F, '!seen[$1]++' | tac 

-F, устанавливает разделитель. В awk действие по умолчанию, когда выражение принимает значение true, это печать текущей строки. !seen[$1] будет истинным, если первое поле не существует в рассматриваемом массиве. Однако, поскольку мы также создаем его с seen[$1]++ , это будет только ложным в первый раз, когда это видно. В результате будет напечатан только первый дубликат.

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

  • Сравните два файла с четырьмя столбцами
  • управлять разделенными запятыми полями
  • Добавьте столбец в CSV, который представляет собой сумму двух предыдущих столбцов
  • Преобразование нескольких файлов из разделителя табуляции в CSV-файл с разделителями-запятыми
  • Объединение CSV с несколькими разделяемыми столбцами
  • конвертировать xml в csv
  • Может ли python извлекать таблицы org-mode из документов org?
  • Как я могу использовать несколько операторов if внутри другого if инструкции awk-программы?
  • Учитывая CSV-файл, как мне удалить контент между 2-й и 3-й вкладками каждой строки?
  • Как я могу преобразовать этот файл excel, чтобы он был не только одной строкой?
  • Извлечение определенных столбцов из текстового файла
  • Interesting Posts

    Найдите любую строку в VI, которая имеет что-то кроме ATCG

    Можете ли вы перевести данные стека? Каковы данные?

    Почему переменная $ PATH отличается между двумя каталогами?

    Perl-скрипт, извлекающий веб-ссылки с использованием регулярного выражения

    Руководство по установке Xen на CentOS 5.9 (Это все еще актуально)

    `mail` – Как я могу снова отобразить список адресов электронной почты?

    QEMU 2.8.0-r1 с vfio VGA passthrough на Gentoo 4.8.17-hardened-r2 зависает при перезагрузке Radeon RX 480

    Как преобразовать файлы txt UTF-8 во все прописные буквы в bash?

    Загрузочный диск RAID не найден после обновления mdadm

    Как изящно приостановить и возобновить цепочку `cmd1 && cmd2 && cmd3`?

    Как создать текстовый файл (1 гигабайт), содержащий случайные символы с кодировкой символов UTF-8?

    Разделить содержимое файла в Linux

    Как установить новый пароль из bash?

    Верхняя команда OSX показывает 5, работающих на четырехъядерном ядре

    Ограничить пользователей SSH SFTP

    Linux и Unix - лучшая ОС в мире.