Подсчет значений между двумя значениями, определенными двумя столбцами

Путем изменения полей заголовка пакета с помощью nftables это возможно даже без использования ip route add nat, который, как простая функциональность маршрутизатора, ограничен уровнем 3 (IP ), а не уровень 4 (TCP, UDP,... ).

ВНИМАНИЕ :здесь требуется nftables >= 0,6 (>= 0,7, если используется notrack )и ядро ​​>= 4,10. Протестировано здесь с nftables 0.8.3 и ядром 4.15.x.

Это довольно компактно, потому что nftables может объединять несколько целей (Здесь 3 цели):

# nft add table raw
# nft 'add chain raw prerouting {type filter hook prerouting priority -300;}'
# nft add rule raw prerouting ip daddr 205.254.211.17 udp dport 5004 notrack ip daddr set 192.168.100.17 udp dport set 5006

Кавычки во 2-й строке, чтобы избежать интерпретации оболочки. Если делать тесты, самый быстрый способ удалить все nft —nft flush ruleset.

Таким образом, просто прочитав его вслух, правило предлагает выбрать только IP-пакет с пунктом назначения 205.254.211.17, который является UDP с портом назначения 5004, а затем помечает его как неотслеживаемый(с помощью conntrack, если он загружен ), устанавливает IP-адрес назначения на 192.168.100.17 и устанавливает порт назначения на 5006.

Вы можете смешивать nftablesс iptablesправилами без особых проблем, если вы не используете natтаблицы на обоих одновременно (хорошо, вы все равно не хотите использовать это ). Возможность указать явный приоритет цепочки позволяет даже выбрать, будут ли хуки nftables запускаться до или после соответствующих хуков iptables, например, здесь, выбрав -301 или -299, чтобы быть уверенным, что они будут запускаться до или после таблицы iptables raw, если была такая необходимость.

1
16.03.2020, 01:20
2 ответа
  1. Поместите каждое значение в строку, но отметьте «начало» и «конец», добавив их Sили E. Теперь отсортируйте значения в числовом виде. Вы получите что-то вроде
3631S
3651
3667
...
3900
3913E
3996S
4006
...
  1. Подсчет вхождений между завершающим значением Sи E.

Пишите сценарий и будет вам счастье!

awk '
    {print $1} 
    $3!="" {print $2"S"; print $3"E"} 
' final_exons.txt | sort -n | awk '
    !/E|S/ {count++; next}
    /S/ {count=0; next}
    /E/ {print line++": "count}'

Первые awkи sortвыполняют шаг 1. Существует тест $3!=""(, он также может быть $2!=""), потому что в 1-м столбце больше строк, чем во 2-м или 3-м.

Второй awkсоответствует шагу 2. Он сбрасывает счетчик, если он читает строки с S, увеличивает его, если в строке нет маркера, и печатает его (вместе с номером строки ), если читает строка с E.

Вывод при запуске файла примера, который вы предоставили, будет 0: 12; 1: 5; 2: 4; 3: 2;...; 22: 0.

0
28.04.2021, 23:20

Я мог бы использовать awk:

awk '{if( ($1 > $2) && ($1 < $3) ){print NR" "$1" "$2" "$3}}' final_exons.txt

Но если col1 и (col2 и col3 )обрабатываются отдельно, лучше их вырвать в отдельные файлы. Или занести данные в базу а затем выполните интервальный тест внутри него. Но наиболее эффективным способом может быть загрузка данных в обычный массив и реализация тестовых циклов на каком-то другом языке сценариев (php, python, perl...)

0
28.04.2021, 23:20

Теги

Похожие вопросы