присоединить f1 к f2 так, чтобы каждая запись f1, способная к объединению, -могла присоединяться только один раз к первому доступному совпадению -способна в f2

Проблема заключается в отсутствии маршрута по умолчанию в таблице main. Это не может быть обнаружено при проверке с помощью ip route get... mark..., потому что весь путь короткий -, замкнутый с "решением", переданным напрямую.

Поскольку маршрута по умолчанию нет, поиск маршрута до 8.8.8.8 завершается ошибкой с сообщением «Сеть недоступна» до того, как пакет получает шанс достичь цепочки OUTPUT манглов, что дает:

Добавление любого маршрута по умолчанию в таблицуmain(даже с использованием не -существующего маршрутизатора, при условии, что его синтаксис допустим ), разрешит предполагаемый поток:

  • пакет сгенерирован,
  • маршрут проверяется впервые в таблице ip rule, считается существующим,
  • проходит цепочку Mangle OUTPUT, наследует метку,
  • перенаправляется (проверка перенаправления в Поток пакетов в Netfilter и General Networking)и, таким образом, во второй раз инициируется поиск в таблице ip rule,
  • получает ранний поиск в таблице 100 и получает свой окончательный маршрут «via 192.168.0.1 dev wlp2s0».

Итак, выбирая в локальной сети IP-адрес, который не принадлежит ни одному хосту , скажем, 192.168.0.250, и добавляя его в скрипт, получая таким образом:

ip route add table 100 default via 192.168.0.1 dev wlp2s0
ip rule add fwmark 0x2 table 100
ip route flush table main
ip route add 192.168.0.0/24 dev wlp2s0
ip route add default via 192.168.0.250 dev wlp2s0

решит тест, сделанный в вопросе:

  • любое соединение, не установленное с TCP-портом назначения 501, инициирует ARP-запросы к 192.168.0.250,который должен истечь через 3 секунды с сообщением «Нет маршрута к хосту» (вместо «Сеть недоступна»)
  • любое соединение с TCP-портом назначения 501 будет (разрешать запрос ARP и )проходить через 192.168.0.1

-3
16.08.2020, 18:26
1 ответ

Написано в Bash и GNU awk. Это не требует сортировки входных файлов :, выходные данные находятся в порядке первого файла, переданного в качестве аргумента.

Я думаю, что ваша четвертая строка вывода содержит ошибку :она снова повторяет первую строку f2 card4.

Весь второй файл сохраняется в массиве Row с номерами строк, хранящимися в виде списка в Map во входной последовательности.

Затем первый файл удаляет все записи карты, которые он использует, до тех пор, пока ничего не останется.

#! /bin/bash --

#:: firstJoin: join only the first records with matching keys.

Join () {

    local AWK='
BEGIN { FS = ","; OFS = ","; reClip = "^[^,]*,[^,]*,"; }
#.. Store input from first file.
function Store (key, tx, Local) {
    sub (reClip, "", tx);
    Row[FNR] = tx;
    Map[key] = Map[key] FNR FS FS;
}
#.. Pair second file with first available.
function Pair (key, tx, Local) {
    if (! (key in Map) || (Map[key] == "")) return;
    printf ("%s%s%s\n", tx, OFS, Row[0+Map[key]]);
    sub (reClip, "", Map[key]);
}
FNR == NR { Store( $1 FS $2, $0); next; }
{ Pair( $1 FS $2, $0); }
'   
    awk -f <( printf '%s' "${AWK}" ) "${2}" "${1}"
}   
    
    Join "${1}" "${2}"

Пробный снимок:

Paul--)./firstJoin  JoinF1 JoinF2
card2,value2,f1c21,f1c22,f2c211,f2c212
card3,value3,f1c31,f1c32,f2c31,f2c32
card4,value4,f1c41,f1c42,f2c41,f2c42
card4,value4,f1c411,f1c412,f2c411,f2c412
card5,vaule5,f1c51,f1c52,f2c51,f2c52
Paul--) 
0
18.03.2021, 23:12

Теги

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