Стабильная сортировка файла по наличию упорядоченных подстрок в каждой строке

Я добился существенного прогресса.

Я отредактировал файл/etc/init.d/boot.d/boot.rootfsck для добавления ramfs как исключения типа файловой системы к процессу fsck. (строка 79).

        aufs|tmpfs|afs|cifs|nfs|novell|smb|ramfs|UNKNOWN*) MAY_FSCK=0 ;;

После выполнения этого больше не необходимо иметь sysconfig с READONLYROOT.

После выполнения этого я устанавливаю pxelinux.cfg, чтобы иметь строку начальной загрузки следующим образом:

LABEL SLES11 InMemory OS
  KERNEL suseBig/vmlinuz-3.0.74-0.6.8-default
  APPEND initrd=suseBig/suseImage rdinit=/sbin/init
  TIMEOUT 100 

Файл suseImage является cpio архивом целой корневой файловой системы рабочей установки SLES, но с измененной/etc/fstab строкой для корня. (я должен был создать архив CPIO путем доступа к этой работе среда SLES от другой рабочей ОС (на другом диске)),

rootfs /                  rootfs       defaults        0 0

После того как это - все на месте, что узел загружается счастливо, и у меня теперь есть рабочая версия электронного диска SLES, который загружается по сети через PXE. (таким образом, это не спешит загружаться, но после этого это не имеет никакого сетевого трафика для ОС). Это не имеет никакой персистентности, но я решаю это для своего случая на прикладном уровне.

4
22.05.2015, 20:09
4 ответа

Похоже, вы хотите систему оценки. Напишите скрипт, чтобы назначить счет к каждой строке, Указывает, как рано на выходе вы хотите его увидеть. awk кажется хорошо подходящим для этой работы. Для вашего примера:

#!/bin/sh
awk '{score=0}
    /usb/ {score=1}
    /Plantronics/ {score=2}
    {print score, NR, $0}' "$@"

Это присваивает счет 0 на каждую строку по умолчанию, а затем переопределяет его с 1, если линия содержит USB и 2, если строка содержит Plantronics . Я поместил USB и законопроектов в этом порядке так, Если линия содержит как строки, конечное значение будет 2. Затем

./score file.txt | sort -k1nr -k2n | cut -d" " -f3-

(где оценка - это имя сценария). Сортировать -k1nr Средство сортировки на основе первого поля (оценка), относиться к этому как число и сортировка более высоких ценностей (Потому что оценка скрипт присваивала высокие оценки к линиям Вы больше всего заинтересованы). -K2N означает, что линии, которые имеют одинаковое значение в первом поле, Сортировать по второму полю, как число в обычном, возрастающем порядке. Второе поле NR , номер записи (номер линии A.K.A.). Это гарантирует, что строки с одинаковым баллом (например, те, которые содержат USB , но не Plantronics ) выйти в своем первоначальном порядке. Если вы не заботитесь об этом, удалите NR, из оператора Print , Удалить -K2N -K2N из команды сортировки и измените -F3- - --f2- . (На самом деле сортировка может сохранить порядок по умолчанию, Так что вам вообще не понадобится.) Конечно, RUD -D "" -F3- полоски от чисел что оценка скрипт добавлена ​​к данным.

Если вы не полностью понимаете, как это работает, попробуйте запустить

./score file.txt

и

./score file.txt | sort -k1nr -k2n

Этот подход довольно гибкий. Например, вышеуказанный код будет производить, по порядку

  • все линии, содержащие Plantronics ,
  • все линии, содержащие USB (но не Plantronics ) и
  • все линии, содержащие ни один из вышеперечисленных,

с каждой группой отсортированы в порядке появления в входном файле. Но, изменяя оценку скрипт следующим образом,

#!/bin/sh
awk '{score=0}
    /usb/ {score+=1}
    /Plantronics/ {score+=2}
    {print score, NR, $0}' "$@"

мы можем назначить оценку 3 к строкам, которые содержат обе строки, поэтому теперь у нас есть

  • все линии, содержащие Plantronics И USB , за которым следуют
  • все линии, содержащие Plantronics (но не USB ), а затем
  • все линии, содержащие USB (Но не Plantronics ), а затем
  • все линии, содержащие ни один из вышеперечисленных.
5
27.01.2020, 20:48

То, что ты делаешь, на самом деле не сортируешь, а выбираешь. Итак, что вы хотели бы сделать, это сначала выбрать все строки, которые содержат "Platronics", затем все строки, которые содержат "usb", и так далее, и, наконец, все строки, которые не соответствуют ничего.

Я не знаю ни одной команды, которая делает это за один раз, но вы можете написать небольшой скрипт, используя python, который делает то, что вы хотите:

import sys

substrings = sys.argv[1:]
lines = sys.stdin.readlines()

# for each substring, print matching lines
for substring in substrings:
    i=0
    while i<len(lines):
        if substring in lines[i]:
            # match: print and remove
            sys.stdout.write(lines[i])
            del lines[i]
        else:
            # no match: try next line
            i += 1

# finally, print all lines that weren't matched
for line in lines:
    sys.stdout.write(line)

Он делает то, что вы хотите:

$ lspci | python substrings.py "USB controller" "PCI bridge"
00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02)
00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 02)
00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 02)
00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 02)
00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 02)
00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02)
00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92)
00:00.0 Host bridge: Intel Corporation 82Q33 Express DRAM Controller (rev 02)
00:02.0 VGA compatible controller: Intel Corporation 82Q33 Express Integrated Graphics Controller (rev 02)
00:02.1 Display controller: Intel Corporation 82Q33 Express Integrated Graphics Controller (rev 02)
00:03.0 Communication controller: Intel Corporation 82Q33 Express MEI Controller (rev 02)
00:19.0 Ethernet controller: Intel Corporation 82566DM-2 Gigabit Network Connection (rev 02)
00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 02)
00:1f.0 ISA bridge: Intel Corporation 82801IB (ICH9) LPC Interface Controller (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801IB (ICH9) 2 port SATA Controller [IDE mode] (rev 02)
00:1f.5 IDE interface: Intel Corporation 82801I (ICH9 Family) 2 port SATA Controller [IDE mode] (rev 02)
2
27.01.2020, 20:48

С SQLite и по порядку :

$sqlite3 <<\EOT
CREATE TABLE file(line);
.import file.txt file
SELECT * FROM file
ORDER BY
CASE
    WHEN line LIKE '%USB%' THEN 0
    WHEN line LIKE '%Realtek%' THEN 1
    ELSE 3
END;
EOT
00:10.0 USB controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81)
00:10.1 USB controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81)
00:10.2 USB controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81)
00:10.3 USB controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81)
00:10.4 USB controller: VIA Technologies, Inc. USB 2.0 (rev 86)
00:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8100/8101L/8139 PCI Fast Ethernet Adapter (rev 10)
00:06.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8100/8101L/8139 PCI Fast Ethernet Adapter (rev 10)
00:07.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8100/8101L/8139 PCI Fast Ethernet Adapter (rev 10)
00:00.0 Host bridge: VIA Technologies, Inc. CN700/VN800/P4M800CE/Pro Host Bridge
00:00.1 Host bridge: VIA Technologies, Inc. CN700/VN800/P4M800CE/Pro Host Bridge
00:00.2 Host bridge: VIA Technologies, Inc. CN700/VN800/P4M800CE/Pro Host Bridge
00:00.3 Host bridge: VIA Technologies, Inc. PT890 Host Bridge
00:00.4 Host bridge: VIA Technologies, Inc. CN700/VN800/P4M800CE/Pro Host Bridge
00:00.7 Host bridge: VIA Technologies, Inc. CN700/VN800/P4M800CE/Pro Host Bridge
00:01.0 PCI bridge: VIA Technologies, Inc. VT8237/VX700 PCI Bridge
00:0f.0 IDE interface: VIA Technologies, Inc. VIA VT6420 SATA RAID Controller (rev 80)
00:0f.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06)
00:11.0 ISA bridge: VIA Technologies, Inc. VT8237 ISA bridge [KT600/K8T800/K8T890 South]
01:00.0 VGA compatible controller: VIA Technologies, Inc. CN700/P4M800 Pro/P4M800 CE/VN800 Graphics [S3 UniChrome Pro] (rev 01)
2
27.01.2020, 20:48

файл cat:

22
z
there's
a
moose
loose
in
the
hoose

например. Задайте для аргументов: free moose - сценарий читается как "$ @" Вы можете использовать сколько угодно.

by=( "$@" )
nl file | sed -nf <(for ((i=0;i<${#by[@]};i++)) ;do 
                      echo "s/.*${by[i]}.*/$i\t&/; t p"
                    done; echo "s/^/$i\t&/; :p p") |
            sort -nk1 -nk2 | cut -f3-

Вывод:

loose
moose
22
z
there's
a
in
the
hoose
1
27.01.2020, 20:48

Теги

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