Sort

如何對單行分隔項進行數字排序?

  • January 15, 2021

我有一行(或多行)由任意字元分隔的數字。我可以使用哪些 UNIX 工具對每行的項目進行數字排序,同時保留分隔符?

範例包括:

  • 號碼列表;輸入:10 50 23 42; 排序:10 23 42 50
  • IP地址; 輸入:10.1.200.42; 排序:1.10.42.200
  • CSV;輸入:1,100,330,42; 排序:1,42,100,330
  • 管道分隔;輸入:400|500|404; 排序:400|404|500

由於分隔符是任意的,請隨意使用您選擇的單字元分隔符提供(或擴展)答案。

使用gawkGNU awk)的asort()功能

gawk -v SEP='*' '{ i=0; split($0, arr, SEP); len=asort(arr);
   while ( ++i<=len ){ printf("%s%s", i>1?SEP:"", arr[i]) }; 
       print "" 
}' infile

用您的分隔符替換*為欄位分隔符。SEP='*'



您也可以在單行的情況下使用以下命令(因為最好不要使用 shell-loops 進行文本處理

tr '.' '\n' <<<"$aline" | sort -n | paste -sd'.' -

用你的分隔符替換 .

添加-usort上面的命令以刪除重複項。

注意:

您可能需要使用-g, --general-numeric-sort選項sort而不是-n, --numeric-sort來處理任何類型的數字(整數、浮點數、科學、十六進制等)。

$ aline='2e-18,6.01e-17,1.4,-4,0xB000,0xB001,23,-3.e+11'
$ tr ',' '\n' <<<"$aline" |sort -g | paste -sd',' -
-3.e+11,-4,2e-18,6.01e-17,1.4,23,0xB000,0xB001

awk無需更改,它仍然會處理這些。

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