Необходимо отфильтровать данные на основе двух столбцов, имеющих много отношений, используя awk

У меня большой файл с 50-ю столбцами и 100K строк, разделенных символом |. Теперь $ 2 (col 2) имеет несколько типов значений $ 1 (col 1), что означает, что col 2 будет повторяться. Поэтому я отсортировал файл. Теперь мне нужно извлечь / отфильтровать файл результатов на основе нижеследующего условия: $ 1 – столбец 1 $ 2 – столбец 2

существует от одного до нескольких отношений корабль между $ 2 и $ 1

условие 1: когда $ 2 имеет оба типа $ 1 (значение $ 1 для $ 2 составляет более 8000, а также менее 8000), затем выберите полную строку, где $ 1 <8000 для данного $ 2 (столбец 2)

условие 2: если $ 2 имеет только $ 1> = 8000, тогда выберите полную строку, где $ 1 является наименьшим для данного $ 2 (столбец 2). Например: исходный файл. В приведенном ниже примере мы имеем 3 типа $ 2 (1234,123 и 456) Теперь 1234 имеет 3 типа значения в столбце 1 ($ 1), значит, больше, а также меньше 8000. Таким образом, мы выбрали полную строку для тех, у кого есть $ 1 <8000.

Для 123 и 465 мы имеем значение столбца 1, превышающее 8000 ($ 1> 80000), поэтому мы выбрали последнюю строку (на основе более высокого значения столбца 8).

Файл примера

4000|1234||||||23 5000|1234||||||40 9000|1234||||||25 10000|123|||||||21 9000|123|||||||22 22000|456|||||||27 15000|456|||||||29 

файл результатов будет иметь:

 4000|1234||||||23 5000|1234||||||40 9000|123|||||||22 15000|456|||||||29 

Пожалуйста посоветуй. Заранее спасибо.

  • Найти и заменить содержимое файла
  • отправка нескольких вложений с помощью uuencode
  • Как вы определяете доступность файловой системы из сценария bash?
  • Потенциальные проблемы (если они есть) при рекурсивной замене пробелов символами подчеркивания во всех именах файлов на жестком диске
  • Преобразование данных вертикального массива в данные горизонтальных массивов
  • printf в сценарии оболочки can not do \ x% x
  • Сценарий оболочки останавливается автоматически примерно через 1 минуту
  • Как выполнить базовые вычисления в сценарии оболочки?
  • 9 Solutions collect form web for “Необходимо отфильтровать данные на основе двух столбцов, имеющих много отношений, используя awk”

    попробуйте (u, являющийся вашим файлом)

     sort -n -t\| -k2 -k1 < u | awk -F\| '$1 < 8000 { a[$2]++ ; print } $1 >= 8000 { if ( !a[$2] && ( !e[$2] || e[$2]<$8 )) {u[$2]=$0;e[$2]=$8;} ; } END { for ( i in u ) print u[i] ;}' 

    дает

     4000|1234

    23 5000|1234

    40 15000|456

    29 9000|123

    22

    где

    • -t\| и -F\| указать sort и awk для использования | как разделитель
    • -k1 : сортировать по второму, затем по полю
    • | в строке сортировки должен быть последний символ в строке
    • $1 < 8000 { a[$2]++ ; print } $1 < 8000 { a[$2]++ ; print } если значение менее 8000, напечатать строки и запомнить значение $ 2
    • $1 >= 8000 { ... } если выше, хранить наивысшую ценность
    • END { for ( i in u ) print u[i] ;} после выхода, сбросить все значение

    • вам может потребоваться повторная сортировка.

    • условие линии 2 может быть упрощено (если условие if нарушено {})

    • некоторые строки в вашем тесте имеют 9 полей.

    обратите внимание, что команда может быть одной выровненной

     ... | sort -n -t\| -k2 -k1 | awk -F\| '...' 
    Interesting Posts

    Ubuntu 16.04 останавливает загрузку, у него настроено шифрование LVM и LUKS, восстановление суперблока уже выполнено

    Формат DDvorak, но QWERTY с модификаторами Ctrl или Alt

    Написание сценария оболочки Unix для вызова функции C и перенаправления данных в файл .txt

    Неопределенные ссылки на «get_rome_version» и «rome_download» при компиляции «btusb_probe» в ядре SM-G360T

    Почему существует так много изменений localhost по умолчанию / etc / hosts?

    Как проверить и запустить скрипт, если он не запущен?

    Как интерпретировать индикаторы качества беспроводной сети?

    Доступ к ретрансляции запрещен при использовании SMTP для внешних получателей POSTFIX FREEBSD

    Как сохранить цветной выход, если трубопровод «меньше -R»?

    Состояние поддержки 5 ГГц для 802.11 WiFi-разработчиков в BSD (2014)

    Расположение ключа SSHD

    Где все возможности хранения файла журнала

    Arch GRUB запрашивает /run/lvm/lvmetad.socket на диске без lvm

    SSH-туннель через MySQL Workbench

    Разница размеров между изо-файлом, сгоревшим на компакт-диск, и файлом, полученным с помощью dd

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