Linux
將多行文本文件排序為一行
我有一個這種格式的文本文件:
#################################### KEY2 VAL21 VAL22 VAL23 VAL24 #################################### KEY1 VAL11 VAL12 VAL13 VAL14 #################################### KEY3 VAL31 VAL32 VAL33 VAL34
我想逐行排序這個文件,
KEY
並在結果中保留接下來的 4 行,所以排序結果應該是:#################################### KEY1 VAL11 VAL12 VAL13 VAL14 #################################### KEY2 VAL21 VAL22 VAL23 VAL24 #################################### KEY3 VAL31 VAL32 VAL33 VAL34
有沒有辦法做到這一點 ?
msort(1)
旨在能夠對具有多行記錄的文件進行排序。它有一個可選的 gui,以及一個普通且可供人類使用的命令行版本。(至少,喜歡仔細閱讀手冊並尋找範例的人類……)AFAICT,您不能對記錄使用任意模式,因此除非您的記錄是固定大小的(以字節為單位,而不是字元或行)。 對於由空行分隔的行塊的記錄
msort
確實有一個選項。-b
您可以將輸入轉換為可以
-b
輕鬆使用的格式,方法是在每個之前放置一個空行###...
(第一個除外)。預設情況下,它會在 stderr 上列印統計資訊,因此至少很容易判斷它什麼時候沒有排序,因為它認為整個輸入都是一條記錄。
msort
適用於您的數據。 該命令在除第 1 行之外的sed
每一行前添加一個換行符。對整個記錄進行排序(按字典順序)。有一些選項可以選擇記錄的哪一部分用作鍵,但我不需要它們。#+``-w
我也沒有去掉多餘的換行符。
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null #################################### KEY1 VAL11 VAL12 VAL13 VAL14 #################################### KEY2 VAL21 VAL22 VAL23 VAL24 #################################### KEY3 VAL31 VAL32 VAL33 VAL34
我沒有任何運氣
-r '#'
將其用作記錄分隔符。它認為整個文件就是一個記錄。