【问题标题】:AWK - find min value of each row with arbitrary sizeAWK - 找到任意大小的每一行的最小值
【发布时间】:2013-03-09 16:55:30
【问题描述】:

我有一个文件,其行如下:

5 3 6 4 2 3 5
1 4 3 2 6 5 8
..

我想得到每一行的最小值,所以例如上面给出的输入,我应该得到:

min of first line:  2
min of second line: 1
..

如何使用 awk 对每行中任意数量的列执行此操作?

【问题讨论】:

  • 这个问题最困难的部分是找不到最小值,打印那些" the first, the second, the third, the forth... text" :) 祝你好运

标签: awk min


【解决方案1】:

如果您不介意使用数字而不是单词的输出,您可以使用这一行:

$ awk '{m=$1;for(i=1;i<=NF;i++)if($i<m)m=$i;print "min of line",NR": ",m}' file
min of line 1:  2
min of line 2:  1

如果你真的想计算序数:

BEGIN {
    split("first second third fourth",count," ")
}
{
    min=$1
    for(i=1;i<=NF;i++)
    if($i<min)
        min=$i

    print "min of",count[NR],"line: \t",min
}

将此保存到script.awk 并运行如下:

$ awk -f script.awk file
min of first line:    2
min of second line:   1

显然,这仅适用于最多 4 行的文件,但只需将序数列表增加到您认为需要的最大数量。你应该可以很容易地在网上找到一份清单。

【讨论】:

  • 此答案效果很好,但如果其中一列为空,则返回空值。这可以通过'{m=$1;for(i=1;i&lt;=NF;i++)if($i&lt;m &amp;&amp; $i!="")m=$i;print "min of line",NR": ",m, " values:", $0}' 解决
【解决方案2】:

你的问题很简单。您需要做的就是在脚本的BEGIN 部分定义一个变量min,并且在每一行,您只需对最小元素执行一个简单的类似C 的算法(将第一个字段设置为@987654323 @,然后检查下一个字段,依此类推,直到到达该行的最后一个字段)。由于变量 NF,您将知道该行中的字段总数。因此,只需编写一个 for 循环即可。一旦为该行完全执行了 for 循环,您将拥有最小的元素,您可以打印它。

【讨论】:

  • 哦,对不起,我写它们时它们是分开的。 1号线:5 3 6 4 2 3 5 2号线:1 4 3 2 6 5 8 3号线:0.5 2 3 0.8 6 5 8
  • 答案已更新。请注意,我不会为此编写代码。
  • 谢谢,你的建议很好 awk '{min=$1; for(i=2;i
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2020-10-11
  • 2016-06-06
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多