Видаліть рядки на основі дублікатів в одному стовпці без сортування


30

У мене є великі 3-стовпчикові файли (~ 10 000 рядків), і я хотів би видалити рядки, коли вміст третього стовпця цього рядка з’явиться в третьому стовпчику іншого рядка. Розміри файлів роблять дещо громіздкими, і я не можу використовувати щось на зразок наведеного нижче коду, оскільки всі рядки не однакові; просто вміст стовпця 3.

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

Відповіді:


31

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

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

Ця команда вказує, awkякі рядки надрукувати. Змінна $3містить весь вміст стовпця 3, а квадратні дужки мають доступ до масиву. Отже, для кожного третього стовпця рядка в імені файлу вузол названого масиву seenзбільшується, а рядок друкується, якщо вміст цього вузла (стовпця 3) раніше не був встановлений ( !).

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

awk -F',' '!seen[$3]++' filename

18

sortкоманда вже оптимізована для обробки величезних файлів. Отже, ви могли б дуже добре використовувати sortкоманду у своєму файлі,

sort -u -t' ' -k3,3 file
  • -u - друкувати лише унікальні рядки.
  • -t- вказати роздільник. Ось у цьому прикладі я просто використовую простір як роздільник.
  • -k3,3 - сортувати на 3-му полі.

Ви можете посилатися на цю відповідь, яка говорить про те, що сортування GNU насправді є кращим підходом до сортування великих файлів. У вашому випадку, я думаю, навіть без цього -parallelви могли б досягти свого кінцевого результату без особливої ​​затримки у часі.


Я збирався коментувати snarkily, що -uбуде видаляти лише повторювані рядки , а не дублюючі ключі ... але я помиляюся.
Randoms

@Ramesh це робить роботу, але сортування змінює послідовність рядків, що, напевно, не завжди очікується.
Бхарат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.