我有一個類似書籍索引的行列表,比如說
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
您可以選擇一個不太可能出現在文字檔案中的字符,將父名稱+該字元新增到每個子行,排序然後從每個子行中刪除父名稱和分隔符,例如使用gnu
sed 和低 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/
- 交換模式空間中的行,替換 後的\n
ewline ,然後刪除一切直到並包括第二個\x02
sort
\x02
sed 's/.*\x02//'