【问题标题】:min and max in certain lines of input file with the tag of line number带有行号标记的输入文件的某些行中的最小值和最大值
【发布时间】:2012-02-13 14:48:11
【问题描述】:

我想找到行号 2000 和 3000 之间的最小值。

我想找到最小值和最大值,当找到最小值和最大值时,我还需要找到找到它的行。 然后我想转到包含行的最大值或最小值上方的一行并输出 同一行的 6 个整数中的第一个整数。

我的输入格式如下。

*KEYWORD
$TIME_VALUE = 1.4000002e+001
$STATE_NO = 15
$Output for State 15 at time = 14
*ELEMENT_SHELL_THICKNESS
1346995      25 1457683 1471891 1457727 1471929
9.953265e-001   9.953265e-001   9.953265e-001   9.953265e-001
1346996      25 1471891 1457685 1471930 1457727
9.953963e-001   9.953963e-001   9.953963e-001   9.953963e-001
1346997      25 1457685 1471892 1471931 1471930
9.953437e-001   9.953437e-001   9.953437e-001   9.953437e-001

所以输出可能是

min=9.953265e-001  on line  07   at  1346995
max=9.953963e-001  on line  09   at  1346996

PS:我可以找到数组的最小值和最大值,但处理这个输入对我来说很难。 等待专家建议。

【问题讨论】:

    标签: linux tags line max


    【解决方案1】:

    我不明白行号 2000 和 3000 之间的要求,但如果它在您的示例中是在行号 6 和 11 之间:

    cat your_file | awk '
      NR >= 6 && NR <= 11{at=$1;getline
        if (max < $1){max=$1;max_line=NR;max_at=at}
        if (min > $1){min=$1;min_line=NR;min_at=at}}
      NR == 7{min=$1;min_line=NR;min_at=at}
      END{
        printf "min=%-13e on line  %02d at %8d\n", min, min_line, min_at
        printf "max=%-13e on line  %02d at %8d\n", max, max_line, max_at}'
    

    最大值不会在第 9 行吗?

    (各位,请不要无用地使用 cat me,我觉得这样更清楚;-)。)

    【讨论】:

    • 是的,你是对的,它应该在第 9 行,但是第 2000 和 3000 行在我的代码中,所以我想要一个通用的答案,你已经给出了......我真的很感激精彩你们的支持。
    • stackoverflow.com/users/851677/jfgagne 我有义务获得给予我的支持。
    • stackoverflow.com/users/851677/jfgagne你能解释一下为什么你用NR而不是FNR吗?如果我正在编写脚本,使用 FNR 不是更好吗?这样在编辑不同文件的外壳中,就不会出错?你说什么?
    • 我说在这种情况下它并不重要:两者都有相同的结果。在一般情况下,没有更好的方法,只有那些产生适合您的解决方案的方法。当您逐渐了解 NR 和 FNR 之间的区别时,我认为您将能够选择适合您想要实现的目标。
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2020-08-16
    • 2019-03-18
    • 2013-04-09
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多