我有一个数据集,我需要做一些特定的排序.这是一个示例:
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脚本编写能力,所以我想我会转向互联网寻求帮助.任何帮助将不胜感激.
我会和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)