我有一行(或多行)数字,这些数字由任意字符定界。我可以使用哪些UNIX工具对每行的项目进行数字排序,并保留定界符?
示例包括:
10 50 23 42
; 排序:10 23 42 50
10.1.200.42
; 排序:1.10.42.200
1,100,330,42
; 排序:1,42,100,330
400|500|404
; 排序:400|404|500
由于定界符是任意的,因此可以使用选择的单字符定界符随意提供(或扩展)答案。
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循环用于文本处理)
tr '.' '\n' <<<"$aline" | sort -n | paste -sd'.' -
用定界符替换点 .
。
添加-u
到sort
上面的命令中以删除重复项。
注意:
您可能需要使用-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
没有必要的改变,它仍然会处理这些。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句