Files

根據第三列排序

  • November 2, 2019

我面臨著一個巨大的 4 列文件。我想根據第 3 列在標準輸出中顯示排序後的文件:

cat myFile | sort -u -k3

這足以執行這個技巧嗎?

sort -k 3,3 myFile

根據目前語言環境定義的排序順序,假設列由空格序列(POSIX/C 語言環境中的 ASCII SPC 和 TAB 字元)分隔,將顯示按第 3 列排序的文件。

請注意,列中包含前導空白(預設分隔符是從非空白到空白的過渡),這可能會在不忽略空格以進行比較的區域設置中產生差異,請使用-b忽略選項前導空格。

請注意,它完全獨立於外殼程序(所有外殼程序都會以相同的方式解析該命令行,外殼程序通常沒有sort內置命令)。

-k 3是對從第3列(包括前導空格)開始的行部分進行排序。在 C 語言環境中,因為空格和製表符排在所有可列印字元之前,這通常會給您相同的結果-k 3,3(除了具有相同第三個欄位的行),

-u如果有幾行相同的排序(即排序鍵排序相同(不一定與相等)相同),則僅保留其中一行。

cat是連接的命令。你在這裡不需要它。

如果列被其他東西分隔,您需要-t指定分隔符的選項。

給定範例文件a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

-u -k 3

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

第 2 行和第 3 行具有相同的第三列,但這裡的排序鍵是從第三列到行尾,因此-u保留兩者。␠ca␠dsorts before␠c␠c因為在我的語言環境的第一遍中忽略了空格,cadsorts before cc

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

對於第 3 列為 的那些,僅保留以上一個␠c。請注意如何␠␠c保留帶有(2 個前導空格)的那個。

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

看看a b c d和的順序是如何a c c c顛倒的。在第一種情況下,因為␠c␠csorts before ␠c␠d,在第二種情況下,因為排序鍵相同 ( ␠c),最後的比較方法是比較完整的行 puts a b c dbefore a c c c

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

一旦我們忽略空格,前 3 行的排序鍵是相同的 ( c),因此它們通過最後的比較排序。

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

在 C 語言環境中,先進行␠␠c排序,␠c因為那裡只有一次傳遞,其中字元(然後是單個字節)根據其程式碼點值(其中空格的程式碼點低於c)進行排序。

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