WedX - журнал о программировании и компьютерных науках

Исключение строк, зависящих от нескольких полей, с помощью awk

У меня довольно простой awk вопрос:

У меня есть следующий файл test1.txt

ids op  count
id1 op1 1
id7 op1 2
id13    op1 3
id4 op1 4
id10    op1 5
id11    op2 1
id2 op2 2
id8 op2 3
id14    op2 4
id5 op2 5

Я хочу исключить определенные строки на основе столбцов op и count. Например, исключите в op2 все, что имеет count от 2 до 5, и в итоге получите следующее test2.txt:

ids op  count
id1 op1 1
id7 op1 2
id13    op1 3
id4 op1 4
id10    op1 5
id11    op2 1
id5 op2 5

Я ищу код awk, который будет делать что-то вроде:

awk '{
    if($2 ~ /op2/ && $3>1 && $3<5)
    skip
    else
    print $0
    }' test1.txt > test2.txt

Этот код действительно работает. Но я ценю любые предложения для 1 лайнеров.

Большое спасибо!

17.11.2017

  • Хм, код выше, кажется, работает для этого примера на самом деле... 17.11.2017
  • переместить условие из блока if и отменить. 17.11.2017

Ответы:


1

Это так просто:

awk 'NR==1 || !($2=="op2" && $3<5 && $3>1)' test.file

Обратите внимание, что программа awk в основном имеет следующий вид:

CONDITION { ACTIONS }

где действие по умолчанию — print. Это означает, что если условие расширится до true и вы не укажете никакого действия, awk напечатает строку ввода.

Логика означает:

выведите все строки, которые не соответствуют обоим следующим условиям:

  • op==op2
  • 2 ‹ число >= 5
17.11.2017
  • хорошо, этот код дает мне только 1 строку: id5 op2 5, а не диапазон. Также я хочу исключить вещи, которые удовлетворяют условию не извлекать их. 17.11.2017
  • да, на самом деле мой код тоже работает - лол... но я ценю ваш ответ. ваше условное выражение неверно, $2=="op2" && $3<5 && $3>1 дает то, что я искал. 17.11.2017

  • 2

    еще один awk однострочник

    $ awk '$2!="op2" || 2>$3 || $3>4' file
    
    ids op  count
    id1 op1 1
    id7 op1 2
    id13    op1 3
    id4 op1 4
    id10    op1 5
    id11    op2 1
    id5 op2 5
    
    17.11.2017

    3

    Если вам нужен онлайнер, попробуйте:

    awk '($2 != "op2") || ($3 <= 1) || ($3 >= 5) { print }' test1.txt > test2.txt
    
    17.11.2017
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]