在 bash 中使用非換行記錄分隔符號對錶進行排序

在 bash 中使用非換行記錄分隔符號對錶進行排序

我有一張桌子,看起來像

'a;b;f|d;e;c|g;h'

我希望按第三列排序。輸出應該是

'g;h|d;e;c|a;b;f'

如果我要使用標準分隔符whitespacenewline那麼可以使用 standard 來完成sort

printf '%b' 'a b f\nd e c\ng h' | sort -k 3

會輸出

g h
d e c
a b f

sort指令也可以使用下列選項採用非標準欄位分隔符號-t

printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'

會輸出

g;h
d;e;c
a;b;f

然而,我未能找到一種方法來對帶有非newline記錄分隔符號的表進行排序。

這能實現嗎?如果是這樣,怎麼辦?

編輯

一個關鍵條件是在此過程中既不改變資料也不改變分隔符,只改變它們出現的順序。

除了命令之外的其他工具sort也可以。最好符合 POSIX 標準,但不是必須的。

答案1

sort 指令只能對由換行符號或 NUL 字元分隔的輸入記錄進行排序,如手冊所示

排序實用程式會依行對文字和二進位檔案進行排序。行是透過換行符號(預設)或 NUL '\0' 字元與後續記錄分隔的記錄

因此,您在某些時候的轉換需要了解記錄分隔符號(在您的情況下|)的知識才能達到所需的結果。任何其他指令(Awk/Perl 或 datamash)都需要做出此假設


不是使用單一獨立工具,而是使用tr,sortpaste就可以做到。透過一次向管道添加一個命令,您可以看到轉換是如何形成的

echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -

相關內容