我有一張桌子,看起來像
'a;b;f|d;e;c|g;h'
我希望按第三列排序。輸出應該是
'g;h|d;e;c|a;b;f'
如果我要使用標準分隔符whitespace
,newline
那麼可以使用 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
,sort
你paste
就可以做到。透過一次向管道添加一個命令,您可以看到轉換是如何形成的
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -