Проблема с выбором ключа сортировки для текстового файла

^ и $ в BRE всегда совпадают в начале и конце строки , как описано здесь .

Все sed , использующие BRE , будут выполнять те же пути. В случае использования команды N , sed видел многозначные строки как одну длинную строку в образец пространстве, при этом каждая действительная строка разделялась внедренной новой строкой \n (литерал \ и n ).

Для подтверждения

printf '1\n2\n' | sed '1N;/2$/d'

ничего не выводите. И:

printf '1\n2\n' | sed '1N;/1$/d'

дал вам:

1
2

Или с помощью команды l ook для более подробного:

$ printf '1\n2\n' | sed 1N\;l
1\n2$
1
2

$ printf '1\n2\n' | sed 1N\;l | od -t a
0000000   1   \   n   2   $  nl   1  nl   2  nl
0000012

-121--90778-

Ответы до сих пор кажутся «да есть много кода» и никто не решает вопрос с наиболее логичным ответом: 15M +? ИТАК, ЧТО? Какое отношение имеют 15M строки исходного кода к цене рыбы? Что делает это таким невообразимым?

Linux явно делает много. Больше всего на свете... Но некоторые из ваших точек показывают, что вы не уважаете то, что происходит, когда он построен и используется.

  • Не все скомпилировано. Система сборки Kernel позволяет быстро определять конфигурации, которые выбирают наборы исходного кода. Некоторые экспериментальные, некоторые старые, некоторые просто не нужны для каждой системы. Посмотрите на /boot/config- $ (uname -r) (на Ubuntu) в make menuconfig и вы увидите, сколько из них исключено.

    Это распределение для рабочего стола с переменным назначением. Конфигурационный элемент для встроенной системы будет использовать только то, что ему нужно.

  • Не все встроено. В моей конфигурации большинство функций ядра построены как модули:

     grep -c '= m '/boot/config-' uname -r '# 4078
    grep -c '= y '/boot/config-' uname -r '# 1944
    

    Для ясности, эти могут быть встроены... Так же, как их можно распечатать и сделать в гигантский бумажный сэндвич. Это просто не имело бы смысла, если бы вы не делали индивидуальную сборку для дискретной аппаратной работы (в этом случае вы бы уже ограничили количество этих предметов).

  • Модули загружаются динамически. Даже если система имеет тысячи модулей, доступных для нее, система позволит вам загрузить только то, что вам нужно. Сравните выходные данные:

     find/lib/modules/$ (uname -r )/-iname '* .ko' | wc -l # 4291
    lsmod | wc -l # 99
    

    Почти ничего не загружено.

  • Микроядра - это не одно и то же. Всего в 10 секундах при просмотре ведущего изображения на странице Википедии , на которую вы ссылаетесь , они будут выделены совершенно другим путям.

    Драйверы Linux интернализованы (в основном в виде динамически загружаемых модулей), а не в пользовательском пространстве, и файловые системы также являются внутренними. Почему это хуже, чем использование внешних драйверов? Почему микро лучше для вычислений общего назначения?


Комментарии снова подчеркивают, что вы не получаете его. Если вы хотите развернуть Linux на дискретном оборудовании (например, в аэрокосмической, TiVo, планшете и т.д.) Вы настраиваете его для создания только необходимых драйверов . То же самое можно сделать на рабочем столе с помощью make localmodconfig . В итоге вы получите крошечное целевое построение Kernel с нулевой гибкостью.

Для таких дистрибутивов, как Ubuntu, допустим один пакет 40MB Kernel. Нет, очистите, что на самом деле предпочтительнее масштабного сценария архивирования и загрузки, что сохранение 4000 + плавающих модулей в виде пакетов будет. Он использует меньше дискового пространства для них, легче пакет во время компиляции, легче хранить и лучше для их пользователей (у которых есть система, которая просто работает).

Будущее, похоже, тоже не является проблемой. Скорость процессора, плотность дисков/цены и улучшение пропускной способности, кажется, намного быстрее, чем рост ядра. Пакет 200MB Kernel через 10 лет не был бы концом, если бы мир.

Это также не улица с односторонним движением. Код выгоняют, если он не поддерживается.

-121--3115-

Попробуйте:

iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A POSTROUTING -j MASQUERADE

Это означает:
1) Любой локальный пользователь, связывающийся с портом tcp 53, отправляет сообщение 23.226.230.72 на порт 5353.
2) Совпадает с 1, но для udp
3) Установите исходную информацию для исходящего пакета как исходящую от нас.

1
23.02.2018, 19:15
4 ответа
$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | sed 's/@/    /g'
ec:8e:b5:f8:a2:12    "Dipin Gyawali"    2015    me    Lan
f0:de:f1:33:33:32    "Dipendra Karki"    2015    me    Lan
e8:b4:c8:b2:d8:b9    "Biswas Gautam"    2016    me    Mob
f0:27:65:70:91:62    "Karan Rai"    2016    cs    Mob

Esto reemplaza cualquier ejecución de tres o más espacios con el carácter@(cualquier carácter que no esté presente en los datos funcionará ).

Luego, sortrecibe instrucciones para interpretar su entrada como@-campos delimitados y clasifica en el tercer campo (año )y quinto campo (dispositivo ). El sedfinal reemplaza cada @en los datos ordenados con cuatro espacios (, puede optar por insertar una pestaña literal aquí en su lugar, o \tcon GNUsed).

Más bonita:

$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | column -s @ -t
ec:8e:b5:f8:a2:12  "Dipin Gyawali"   2015  me  Lan
f0:de:f1:33:33:32  "Dipendra Karki"  2015  me  Lan
e8:b4:c8:b2:d8:b9  "Biswas Gautam"   2016  me  Mob
f0:27:65:70:91:62  "Karan Rai"       2016  cs  Mob

Lo siguiente utiliza awkpara formatear cada columna como una cadena de 20 caracteres de ancho -justificada a la izquierda:

$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | awk -F@ '{ for (i=1;i<=NF;++i) printf("%-20s",$i); print "" }'
ec:8e:b5:f8:a2:12   "Dipin Gyawali"     2015                me                  Lan
f0:de:f1:33:33:32   "Dipendra Karki"    2015                me                  Lan
e8:b4:c8:b2:d8:b9   "Biswas a Gautam"   2016                me                  Mob
f0:27:65:70:91:62   "Karan Rai"         2016                cs                  Mob

O puede formatearlos individualmente:

$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | awk -F@ '{ printf("%s %-30s %-30s %-30s %s\n", $1,$2,$3,$4,$5) }'
ec:8e:b5:f8:a2:12 "Dipin Gyawali"                2015                           me                             Lan
f0:de:f1:33:33:32 "Dipendra Karki"               2015                           me                             Lan
e8:b4:c8:b2:d8:b9 "Biswas a Gautam"              2016                           me                             Mob
f0:27:65:70:91:62 "Karan Rai"                    2016                           cs                             Mob
0
28.01.2020, 00:39

Si desea conservar el espacio exactamente (en lugar de reformatearlo, como en la respuesta de Kusalananda)y no desea depender de las posiciones exactas de las columnas (como en Jeff La respuesta de Schaller ), algo como este script de Perl funcionará:

#!/usr/bin/perl
use 5.022;

my @dat;
while (<<>>) {
    #          0     1      2        3     4     5     6     7     8
    #          mac   sp     name     sp    yr    sp    dpt   sp    net
    my @m = /^(\S+) (\s+) "([^"]+)" (\s+) (\S+) (\s+) (\S+) (\s+) (\S+)$/x
        or die "invalid line: $_";
    push @dat, \@m;
}

@dat = sort {
    $a->[4] <=> $b->[4] || $a->[6] cmp $b->[6] || $a->[2] cmp $b->[2]
} @dat;

foreach (@dat) {
    print join('', @$_), "\n";
}

Tenga en cuenta que utiliza Perl v5.22.0 o posterior para el operador <<>>; debería funcionar con versiones antiguas de Perl si usa <>en su lugar. El programa tiene esencialmente tres "párrafos" :el primero analiza sus líneas usando una expresión regular, capturando también el espacio exacto usado. El segundo párrafo ordena los datos. El tercer párrafo lo imprime de nuevo.

0
28.01.2020, 00:39

Si su archivo tiene un formato estricto (como se muestra ), puede solicitar sortque use columnas específicas para las claves:

sort -k1.75,1.78n -k1.91,1.92 -k1.105,1.107 -k1.41,1.74 input

... que transforma la entrada de muestra en:

f0:de:f1:33:33:32                       "Dipendra Karki"                  2015            me            Lan
ec:8e:b5:f8:a2:12                       "Dipin Gyawali"                   2015            me            Lan
f0:27:65:70:91:62                       "Karan Rai"                       2016            cs            Mob
e8:b4:c8:b2:d8:b9                       "Biswas Gautam"                   2016            me            Mob
0
28.01.2020, 00:39

Otro enfoque sería reemplazar cada carácter de espacio entre comillas con el carácter de marcador de posición @, luego ordenar, luego cambiar los caracteres @ nuevamente a espacios:

perl -pe 's#("[^"]*")#$1 =~ s/ /@/rg#eg' filename | sort -k 3 -k 4 -k 2 | sed 's/@/ /g'
0
28.01.2020, 00:39

Теги

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