在tcsh中按绝对值对数字进行排序

问题描述 投票:0回答:1

在 tcsh 中,我有一个数组

set value = "-4.13 3.62 3.40 3.83 3.53 3.49 3.53 3.64 3.31 3.34 3.55 3.99 3.42 3.47 3.54 3.35 3.40 3.41 3.37 3.96 3.44 3.66 3.51 3.33 3.50 3.48 -3.38 -3.33 -3.61 -3.37 -3.92 -4.27 -3.32"

有数字。我想按绝对值对它们进行排序。我做了以下脚本,它有时有效,但不适用于这个特定的数组。

perl -e 'print join " ", sort { abs($b) <=> abs($a) } split(" ", $ARGV[0]);' "$value"

返回消息如

无法识别的开关:-4.13 3.62 3.40 3.83 3.53 3.49 3.53 3.64 3.31 3.34 3.55 3.99 3.42 3.47 3.54 3.35 3.40 3.41 3.37 3.96 3.44 3.6 6 3.51 3.33 3.50 3.48 -3.38 -3.33 -3.61 -3.37 -3.92 -4.27 -3.32 (-h 将显示有效选项).

那么 value_abs 为空。您能帮忙解决这个问题吗?我也不确定 for 循环排序是否是一个好主意,有没有更好的解决方案?

set value_abs = `perl -e 'print join " ", sort { abs($b) <=> abs($a) } split(" ", $ARGV[0]);' "$value"`

set sorted_indices = ()

foreach element ( $value_abs )
    set index = `echo "$value:q" | tr ' ' '\n' | awk -v el="$element" '{if ($1 == el) print NR}'`
    set sorted_indices = ( $sorted_indices $index )
end
shell perl tcsh
1个回答
1
投票

你需要告诉 Perl 第一个数字不是开关。使用

--

perl -e 'print join " ", sort { abs($b) <=> abs($a) } split(" ", $ARGV[0]);' -- "$value"
© www.soinside.com 2019 - 2024. All rights reserved.