Необходимо отфильтровать данные на основе двух столбцов, имеющих много отношений, используя 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 

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

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\| '...' 
  • Разбор допустимого вывода в скрипте оболочки с помощью sed / grep
  • Заменить значение в одинарных кавычках в строке, содержащей определенное слово, используя команду sed
  • Если я выполнил файл сценария Bash, будут ли выполняться все команды внутри скрипта Bash как sudo?
  • Вставить в таблицу Oracle в цикле
  • Сценарий оболочки не работает, чтобы открыть LimeChat через терминал
  • Динамически присваивать массив значению переменной. Eval?
  • Используйте только строки, содержащие x или меньшее количество чисел. TXT-файл
  • Как перемещать или копировать список файлов, на которые ссылается файл csv, в новую папку
  • Принуждение к расширению глобального псевдонима частью слова
  • Лучший способ обмена именами файлов
  • Оболочка оболочки оболочки для предотвращения запуска команды без аргументов?
  • Как изменить сортировку результата из grep -rc
  • Interesting Posts

    Каждый раз, когда я перезагружаю компьютер, мне нужно перезапустить службу Bluetooth, как я могу это исправить?

    Нужно ли перестраивать модуль nvida после перекомпиляции ядра?

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

    модификаторы даты

    Cpupower не работает надежно

    Кто является владельцем файла, если файл создан с помощью команды sudo?

    как выполнить несколько команд gnome-terminal

    Fluxbox Sytem Tray добавляет все больше пробелов

    Скопировать дату создания файла в метаданные в ffmpeg

    Пользователи, группы и разрешения Unix

    В чем разница между вставкой с помощью средней кнопки мыши и Shift + Ins?

    Простой интерфейс без клавиатуры для воспроизведения видео?

    Просмотр консольного вывода из задания Upstart без лог-файлов

    git tab-completion не работает на Debian Wheezy, но работает на Squeeze

    FreeBSD – основные и второстепенные обновления с использованием портов?

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