按绝对值排序整数

时间:2016-02-14 14:01:46

标签: bash sorting

我有一个整数列表,我想用sort对它进行排序,但我想对整数的绝对值进行排序。例如7 0 5 10 -2应该给0 -2 5 7 10(整数在我的文件中的多行上分开)

我不认为sort中有一个选项可以做到这一点,但我找不到其他命令来排序。 -n选项按自然顺序排序,-g不是我想要的。

我试着看awk,但我不知道它是否可以帮助我。

4 个答案:

答案 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个变量。