【问题标题】:find lowest value and index of floating point array awk, sed, sort查找浮点数组 awk、sed、排序的最小值和索引
【发布时间】:2020-06-28 22:35:21
【问题描述】:

我有以下数组:

echo $array
0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.4 0.3 0.3 0.2 0.4 0.4 0.4 0.4 0.5 0.5 0.4 0.2

我已经编写了一个代码来对值进行排序并获得索引号:

echo $array | tr -s ' ' '\n' | awk '{print($0" "NR)}' | sort -g -k1,1
0.2 11
0.2 19
0.3 1
0.3 10
0.3 2
0.3 9
0.4 12
0.4 13
0.4 14
0.4 15
0.4 18
0.4 3
0.4 4
0.4 5
0.4 6
0.4 7
0.4 8
0.5 16
0.5 17

我很难仅提取第一列中具有最低值的行(即,总体而言,数组中的最低值)。例如,上述示例所需的最终产品将是:

0.2 11
0.2 19

它应该能够处理一个和多个最低值索引的实例。如果不需要,代码不需要包含任何类型的 awk、sort、sed 或任何命令 - 任何东西都可以工作(这就是我在完成最终任务时所获得的)。

【问题讨论】:

  • 顺便说一句。你的数组只包含一个长元素或者是一个字符串。

标签: sorting awk sed


【解决方案1】:

awk 中使用asort() 函数

awk '{split($0,a); for (i in a) a[i]=a[i]" "i; n=asort(a); for (i = 1; i <= 2; i++) print a[i]} '

演示:

$echo $array
0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.4 0.3 0.3 0.2 0.4 0.4 0.4 0.4 0.5 0.5 0.4 0.2
$echo $array  |  awk '{split($0,a); for (i in a) a[i]=a[i]" "i; n=asort(a); for (i = 1; i <= 2; i++) print a[i]} '
0.2 11
0.2 19
$

解释:

{split($0,a); -- Initialize a array a from input record
 for (i in a) a[i]=a[i]" "i;  -- Append  current row number to existing value 
n=asort(a); -- Call sort array function and store number of element in variable n. 
for (i = 1; i <= 2; i++)   -- loop for first 2 element of array 
print a[i]} 

Documentation on asort()

附: --> 不需要在 n 中存储元素的数量。

【讨论】:

    【解决方案2】:

    打印输出,直到第一列中的数字不变。

    echo $array | tr -s ' ' '\n' | awk '{print($0" "NR)}' | sort -g -k1,1 |
    awk 'length(last) == 0 || last == $1 { last=$1; print; }'
    

    注意事项:

    • 最好总是引用变量扩展echo "$array"
    • 如果你不引用$array,你可以只引用printf "%s\n" $array
    • 您可以使用nl 对行进行编号(但列的顺序会有所不同)。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2011-03-30
      • 2017-11-05
      • 2014-10-23
      • 2012-11-25
      相关资源
      最近更新 更多