Bash脚本订单文件大小

时间:2015-10-15 16:41:15

标签: bash shell sorting

我想按照大小排序文件列表,但要将它与特定数字(另一个文件大小)进行比较,作为比较绝对距离的规则。

这必须使用bash脚本完成。

例如:

Size to compare: 5
List of files sizes: { 1, 2, 6, 10, 5 }
Result: {5, 6, 2, 1, 10 }

我远不是bash编码方面的专家,所以我很感激这里的一些帮助。

3 个答案:

答案 0 :(得分:1)

size=5
source=(1 2 6 10 5)
for i in ${source[@]}; do j=$((i-size)); echo ${j/-/} $i; done | sort -n | cut -d " " -f 2 | tr "\n" " "

输出:

5 6 2 1 10 

此解决方案还使用了chepner提到的Schwartzian变换。

答案 1 :(得分:1)

使用Schwartzian Transform

{{1}}

我只使用Perl,因为它是我认为访问绝对值函数的最短路径。

答案 2 :(得分:1)

可以从bash脚本调用Perl,因为它已经安装在任何地方。

perl -e '$n=shift; @A=split/,/,(shift); print join ", ", sort {abs($a-$n)<=>abs($b-$n)} @A' 5 1,2,6,10,5

输出:

5, 6, 2, 1, 10

$n使用shift设置为您的号码5 通过使用逗号分隔输入字符串作为分隔符来设置数组@A 使用自定义排序函数sort {abs($a-$n)<=>abs($b-$n)}

打印数组

假设您的输入文件大小在不同的行上的变化:

printf "%d\n" 1 2 6 10 5 | perl -ne 'BEGIN{$n=shift} push @A, $_; END{print join "", sort {abs($a-$n)<=>abs($b-$n)} @A}' 5

输出:

5
6
2
1
10