Arhn - архитектура программирования

Bash/awk: поиск дубликатов на основе двух столбцов, сохранение строк на основе значений в других столбцах

Мой предыдущий вопрос (здесь) стал немного сложнее.

  1. Мне нужно идентифицировать повторяющиеся записи в текстовом файле, разделенном запятыми, на основе комбинации столбцов 4 и 5, которые представляют 4: идентификатор, 5: дату. Эти два столбца можно просто объединить.

  2. Если есть дубликаты, мне нужно выполнить проверку на основе подстроки другого столбца, которая представляет значение int. Дубликат с более высоким значением следует сохранить. Пример создания подстроки: cut -d"," -f14 file.txt | grep -o "N0[0-9]{3}" | sed 's/N0//g'

  3. Если значения int совпадают, мне нужно выполнить еще одну проверку на основе столбца 9, который представляет дату. Ряд с более поздней датой следует сохранить.

Пример данных:

xyz,xyz,xyz,X08ABC,20200804,xyz,xyz,xyz,2020-08-17T20:08:27.000000Z,xyz,xyz,xyz,xyz,long_string_N0809_bla
xyz,xyz,xyz,X08ABC,20200804,xyz,xyz,xyz,2020-09-25T16:18:43.000000Z,xyz,xyz,xyz,xyz,long_string_N0809_bla

В примере третьи столбцы будут сохранены, а первые два отброшены. Все они дубликаты (col4+col5 = одинаковые), значение int в столбце 14 самое высокое в строках 2 и 3, дата в столбце 9 позже в строке 3, чем в строке 2.

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

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

29.09.2020

Ответы:


1

Мне потребовалось некоторое время, чтобы прочитать другие вопросы, руководства и т. д., но я думаю, что это должно быть возможным решением. Однако сортировка нужна, поэтому порядок строк, к сожалению, не остается прежним. Кроме того, он полагается на то, что записи столбцов всегда имеют одинаковую длину, что может привести к большим проблемам.

sort -t, -k 14.15,14.17r -k9.1,9.4r -k9.6,9.7r -k9.9,9.10r file.txt | awk -F, '{OFS=","} {print $0, $4"_"$5}' | awk -F, '!a[$15]++'

Это сортирует строки по подмножеству значений int из столбца 14 (809) и по дате в столбце 9 (сортировка по году, месяцу, дате). Затем создается новый столбец, объединяющий столбцы 4 и 5, для выявления дубликатов. Последняя команда awk сохраняет только те повторяющиеся строки, которые появляются первыми, что также является причиной того, что все нужно было отсортировать в первую очередь.

Улучшения приветствуются!

30.09.2020
  • 1) Достаточно числового переворота для одного столбца и переворота для дат, это ваши вторичные сортировки. 2) Для дубликатов вы можете использовать комбинацию полей в качестве хеш-ключа, не нужно объединять их как дополнительное поле. sort -t, -rnk14 -rk9 | awk -F, '!seen[$4,$5]++' 01.10.2020
  • Спасибо! Два вопроса: я не уверен на 100% в пункте 1). Мне все еще нужно разделить дату (столбец 9) на год, месяц, дату, так как она разделена -. Или я что-то упускаю? Простая сортировка столбца 14 по числовому значению также не работает, если только я не подмножу позиции, содержащие интересующее числовое значение. 01.10.2020
  • man sort для того, какие виды сортировки вы можете использовать для каждого поля. Для 9 это просто сортировка по алфавиту, в обратном порядке или нет, в зависимости от ваших потребностей. Для 14 я вижу только две строки примера, но они кажутся перемешанными цифрами и буквами, попробуйте -V, -h и/или найдите это, это хорошо задокументировано. 01.10.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..