我有一个整数列表,我想用sort
对它进行排序,但我想对整数的绝对值进行排序。例如7 0 5 10 -2
应该给0 -2 5 7 10
(整数在我的文件中的多行上分开)
我不认为sort
中有一个选项可以做到这一点,但我找不到其他命令来排序。 -n
选项按自然顺序排序,-g
不是我想要的。
我试着看awk
,但我不知道它是否可以帮助我。
答案 0 :(得分:3)
使用
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
cat numbers.txt | sed -r 's/-([0-9]+)/\1-/g;' | sort -n | sed -r 's/([0-9]+)-/-\1/g;'
将数字放在数字后面sed
按数字排序sort
将减号再次放在数字答案 1 :(得分:2)
我无法在任何地方找到此文档,但是当您运行sort -Vd
时,它会按绝对值排序。它是“版本排序”和“数字排序”选项的组合。使用1 5 3 7 -2 -4 -9
,它自己的版本排序就是这样的:
1
3
5
7
-2
-4
-9
并按照这种方式进行数字排序;
-9
-4
-2
1
3
5
7
对于这两个选项,它就像这样排序;
1
-2
3
-4
5
7
-9
我不知道这是出于设计还是偶然,我只是在GNU排序中进行了测试。我发现这个技巧对某些代码高尔夫球情况非常有用。
答案 2 :(得分:1)
如果您的文件名为fname
,则以下内容应该有效:
paste <(sed 's/-//' fname) fname | sort -n | cut -f 2
sed
删除-
以生成绝对值paste
,将绝对值作为第一列加入,然后由sort
编辑。然后cut
出来。
答案 3 :(得分:1)
一线perl解决方案。更常用于浮点值。例如:
$ cat numbers.txt
1 -100 5 -4 7 -9 12 25.3 1.8 -1 33.5
$ perl -lane 'print(join " ", sort {abs($a) <=> abs($b)} @F);' numbers.txt
1 -1 1.8 -4 5 7 -9 12 25.3 33.5 -100
如果您希望订单降序,只需撤消$a
和$b
个变量。