Удалить строки на основе дубликатов в одном столбце без сортировки

30

У меня есть большие файлы с 3 столбцами (~ 10000 строк), и я хотел бы удалить строки, когда содержимое третьего столбца этой строки появляется в третьем столбце другой строки. Размеры файлов делают сортировку немного громоздкой, и я не могу использовать что-то вроде приведенного ниже кода, потому что все строки не идентичны; только содержимое столбца 3.

awk '!seen[$0]++' filename
Зак C
источник

Ответы:

31

Просто измените команду awk на столбец, который вы хотите выполнить, чтобы удалить дублированные строки на основе (в вашем случае третий столбец):

awk '!seen[$3]++' filename

Эта команда сообщает, awkкакие строки печатать. Переменная $3содержит все содержимое столбца 3, а квадратные скобки - доступ к массиву. Таким образом, для каждого третьего столбца строки в имени файла узел именованного массива seenувеличивается, и строка печатается, если содержимое этого узла (column3) не было ( !) ранее установлено.

Вышеупомянутая awkкоманда будет работать, если ваши столбцы во входном файле разделены между собой spaceили Tabмежду собой, если столбцы разделены чем-то другим, вам нужно указать awk с его -Fопцией. Так, например, если все столбцы разделены с помощью comma ( ,) и хотят удалить строки на основе -F','опции использования третьего столбца .

awk -F',' '!seen[$3]++' filename
αғsнιη
источник
18

sortКоманда уже оптимизирована для обработки огромных файлов. Таким образом, вы можете очень хорошо использовать sortкоманду в вашем файле, как,

sort -u -t' ' -k3,3 file
  • -u - печатать только уникальные строки.
  • -t- укажите разделитель. Здесь, в этом примере, я просто использую пробел в качестве разделителя.
  • -k3,3 - сортировка по 3-му полю.

Вы можете сослаться на этот ответ, который предполагает, что сортировка GNU на самом деле является лучшим подходом для сортировки больших файлов. В вашем случае, я думаю, что даже без этого -parallel, вы могли бы достичь конечного результата без большой задержки.

Рамеш
источник
Собирался комментировать язвительно, -uчто только удалит дубликаты строк , а не дубликаты ключей ... но я ошибаюсь.
Рэндомс
@Ramesh выполняет свою работу, но сортировка меняет последовательность строк, которую, я думаю, не ожидал всегда.
Бхарат