各行の順序付きサブストリングに基づいてファイルを確実にソートします。

各行の順序付きサブストリングに基づいてファイルを確実にソートします。

スクリプトを使用して処理中のソースのリストがあります。例は次のとおりです。

alsa_input.usb-AVEO_Technology_Corp._USB2.0_Camera-02-Camera.analog-mono
alsa_input.pci-0000_00_14.2.analog-stereo
alsa_input.usb-Plantronics_Plantronics_GameCom_780-00-P780.analog-stereo

どの場所でもサブストリングに基づいてソートしたいと思います。

たとえば、USBデバイスを最初に配置したいsort --by usb file.txt(順序を維持しながら)。

alsa_input.usb-AVEO_Technology_Corp._USB2.0_Camera-02-Camera.analog-mono
alsa_input.usb-Plantronics_Plantronics_GameCom_780-00-P780.analog-stereo
alsa_input.pci-0000_00_14.2.analog-stereo

より細かい優先順位を得るために複数の部分文字列を指定できるようにしたいです。したがって、sort --by Platronics --by usb file.txt「Platronics」を含む行が最初に配置され、「usb」を含む行、残りが順番に配置されます。

これを行うために使用できるコマンドラインユーティリティはありますか?

答え1

スコアシステムが欲しいようです。出力でその行をどのくらい頻繁に表示したいかを示すスコアを各行に割り当てるスクリプトを作成します。  awkその仕事にぴったりなようです。あなたの例:

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

デフォルトでは、これは各行にスコア0を割り当て、行に含まれている場合は1で上書きされ、行に含まれている場合はusb 2で上書きされますPlantronicsusbステートメントをこの順序で配置したので、Plantronics1行に2つの文字列が含まれている場合、最終値は2になります。それから

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

scoreスクリプト名はどこにありますか?)最初のフィールド(スコア)に  sort -k1nr基づいてソートを意味します。これは数値として処理され、より高い値が最初にソートされます(スクリプトが最も興味のあるscore行に高いスコアを割り当てるため) 。  -k2nつまり、最初のフィールドに同じ値がある行の場合、2番目のフィールドに基づいて通常の昇順でソートされます。 2番目のフィールドはNRレコード番号(行番号とも呼ばれます)です。これにより、スコアが同じ行(たとえば、usb含まれているが含まれていない行Plantronics)が元の順序で表示されます。これを気にしない場合は、NR,ステートメントから削除し、コマンドから削除してからprint次のように変更します。 (実際には、これらの順序はデフォルトで維持される可能性があるため、まったく必要ないかもしれません。)もちろん、これはスクリプトがデータの前に追加する番号を削除します。-k2nsort-f3--f2-sortcut -d" " -f3-score

これがどのように機能するかを完全に理解していない場合は、以下を実行してみてください。

./score file.txt

そして

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

このアプローチは非常に柔軟です。たとえば、上記のコードは次のように生成します。

  • 以下を含むすべてのPlantronics
  • usb含めるが含まないすべてのPlantronics行と
  • 上記を含まないすべての行、

各グループは、入力ファイルの発生順序に従ってソートされます。ただし、scoreスクリプトを次のように変更すると、

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

2つの文字列を含む線に3つの点を割り当てることができるので、

  • 以下を含むすべての行Plantronics そして usb、続いて
  • Plantronics次を含むが含まないすべてのusb行の後に
  • 次を含むusbが含まないすべての行Plantronics
  • 上記を含まないすべての行。

答え2

withsqliteORDER BY句:

$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)

答え3

あなたがやっていることは、実際に分類するのではなく、選択することです。したがって、すべきことは、まず「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)

答え4

猫ファイル:

22
z
there's
a
moose
loose
in
the
hoose

例えば。引数を次に設定します。loose 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

関連情報