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