Classic Shell Scripting 讀書筆記(二)
排序文本 sort
locale 對排序的影響
重音位置不同的法文單字
1 2 3 4 5 6 |
$ cat french côte cote coté côté |
查看字元在 ISO 的八進位數值
1 2 3 4 5 6 |
$ man iso_8859_1 Oct Dec Hex Char Description ──────────────────────────────────────────────────────────────────── 351 233 E9 é LATIN SMALL LETTER E WITH ACUTE 364 244 F4 ô LATIN SMALL LETTER O WITH CIRCUMFLEX |
分別用傳統 ASCII 和 Canadian-French(系統必須先安裝法文)排序,結果不同
1 2 3 4 5 6 7 8 9 10 11 12 |
$ LC_ALL=C sort french cote coté côte côté $ LC_ALL=fr_CA.utf8 sort french cote côte coté côté |
注意空白
以 -k
指定排序字段時
- 如未以
-t
指定分隔符號,預設以空白分隔並忽略開頭與結尾的空白 - 如果指定
-t
,則開頭與結尾的空白不會被忽略,例如 ” -X- ” 以-t " "
分隔,會被分成三個字段: 空白, “-X-” 及空白 - 如果僅指定一個字段編號,意思是「從該字段開始,一直比對到行的結尾」
-k{n},{m}
格式代表「從第 n 個字段開始,至第 m 個字段結尾」-k{n.i},{m.j}
格式代表「從第 n 個字段第 i 個字元開始,至第 m 個字段第 j 個字元結尾」
穩定性
紀錄內的排序字段都相同,但輸出與輸出不一致,代表 sort 並不穩定。GNU 實現了 coreutils 套件,可透過 --stable
彌補這個不足
1 2 3 4 5 6 7 8 9 10 11 |
$ sort -t_ -k1,1 -k2,2 << EOF > one_two > one_two_three > one_two_four > one_two_five > EOF one_two one_two_five one_two_four one_two_three |
排除重複
使用 -u
排除重複是基於 key 而非整筆紀錄,如果是後者,則可以搭配 uniq
工具使用