Проблема заключается в отсутствии маршрута по умолчанию в таблице main
. Это не может быть обнаружено при проверке с помощью ip route get... mark...
, потому что весь путь короткий -, замкнутый с "решением", переданным напрямую.
Поскольку маршрута по умолчанию нет, поиск маршрута до 8.8.8.8 завершается ошибкой с сообщением «Сеть недоступна» до того, как пакет получает шанс достичь цепочки OUTPUT манглов, что дает:
ip rule
(решение о маршрутизации в Поток пакетов в Netfilter и общей сети ), Добавление любого маршрута по умолчанию в таблицуmain
(даже с использованием не -существующего маршрутизатора, при условии, что его синтаксис допустим ), разрешит предполагаемый поток:
ip rule
, считается существующим, ip rule
, 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
решит тест, сделанный в вопросе:
Написано в 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--)