Linux

將多行文本文件排序為一行

  • April 11, 2017

我有一個這種格式的文本文件:

####################################
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 '#'將其用作記錄分隔符。它認為整個文件就是一個記錄。

引用自:https://unix.stackexchange.com/questions/333961