按同一行上不同值之间的最大差异排序

Edd*_*die 2 sorting bash

我有一个数据集,我需要做一些特定的排序.这是一个示例:

43      37      1512    1591    59      2819            97      1546    1435
43      37      1512    1591    59      2819            98      331     1539
43      37      1512    1591    59      2819            99      67      633
43      67      2772    2881    37      10189           51      2000    806
43      67      2772    2881    37      10189           52      228     1315
43      67      2772    2881    37      10189           61      2657    718
43      67      2772    2881    37      10189           62      893     1818
43      67      2772    2881    37      10189           63      1553    1293
43      67      2772    2881    47      8375            74      95      185
43      67      2772    2881    47      8375            75      1919    862
43      67      2772    2881    47      8375            79      1425    651
31      61      1800    1891    47      3983            86      137     300
31      61      1800    1891    47      3983            87      67      470
31      61      1800    1891    47      3983            88      1711    285
Run Code Online (Sandbox Code Playgroud)

对于每一行,我需要将值从最小值排序到最长值,然后找出每个值之间的差异.然后,我需要找到排序值之间的最小差异,并将该数字附加到行的末尾.最后(这里是棘手的部分),我需要以数字方式显示"最小差异"列中的所有行,但其他值必须按原始顺序排列.

例如,使用数据集的最后一行,脚本必须执行以下操作:

开始:
31 61 1800 1891 47 3983 88 1711 285

排序方式:
31 47 61 88 285 1711 1800 1891 3983

每个#之间的差异
. 16 14 27 197 1426 89 91 2092

最小的差异:
14

在其自己的列中添加与ORIGINAL LINE最小的差异:
14 31 61 1800 1891 47 3983 88 1711 285

最后,根据新添加的"最小差异"列对所有行进行排序.我不关心列之间的空白量,它可以根据需要波动以使脚本更简单.

这有点超出了我的bash脚本编写能力,所以我想我会转向互联网寻求帮助.任何帮助将不胜感激.

gle*_*man 5

我会和Perl一起去​​:

perl -lane '
    BEGIN { $,=" "; sub numeric {$a <=> $b} } 
    @sorted   = sort numeric @F;
    @diffs    = map {$sorted[$_] - $sorted[$_-1]} 1..$#sorted;
    $min_diff = ( sort numeric @diffs )[0]; 
    print $min_diff, @F
' filename | sort -n
Run Code Online (Sandbox Code Playgroud)
4 43 67 2772 2881 37 10189 63 1553 1293
4 43 67 2772 2881 47 8375 74 95 185
4 43 67 2772 2881 47 8375 75 1919 862
4 43 67 2772 2881 47 8375 79 1425 651
5 43 67 2772 2881 37 10189 62 893 1818
6 31 61 1800 1891 47 3983 87 67 470
6 43 37 1512 1591 59 2819 97 1546 1435
6 43 37 1512 1591 59 2819 98 331 1539
6 43 37 1512 1591 59 2819 99 67 633
6 43 67 2772 2881 37 10189 51 2000 806
6 43 67 2772 2881 37 10189 52 228 1315
6 43 67 2772 2881 37 10189 61 2657 718
14 31 61 1800 1891 47 3983 86 137 300
14 31 61 1800 1891 47 3983 88 1711 285
Run Code Online (Sandbox Code Playgroud)

Ruby甚至更短:

ruby -ane '
  min_diff = $F.map(&:to_i).sort.each_cons(2).map {|a,b| b-a}.sort.min
  puts [min_diff, $F].join " "
' 
Run Code Online (Sandbox Code Playgroud)