將行進行排序,同時將縮進行與其父行分組

將行進行排序,同時將縮進行與其父行分組

我有一個類似書籍索引的行列表,比如說

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

現在我想以明顯的方式對這些行進行排序:我想將每個“父”條目(day, night, eve)與其各自的縮進“子”條目(satur-, sun-, ...)分組,並按其父條目對這些組進行排序。我還想對任何給定組中的子條目進行排序。

因此,期望的輸出為:

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

我如何透過使用像這樣的unix核心工具來最好地實現這一點sort

答案1

您可以選擇一個不太可能出現在文字檔案中的字符,將父名稱+該字元新增到每個子行,排序然後從每個子行中刪除父名稱和分隔符,例如使用gnused 和低 ascii 字符,例如\x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

它是如何運作的:
第一個sed執行以下操作:
/^[^[:blank:]]/h- 將非縮進行(父行)複製到保留空間
//!G- 在縮進行(子行)上將保留空間內容附加到模式空間
s/\(.*\)\n\(.*\)/\2\x02\1/- 交換模式空間中的行,替換 後的\newline ,然後刪除一切直到並包括第二個\x02
sort\x02sed 's/.*\x02//'

相關內容