【问题标题】:Get line number where first occurrence of a value appears?获取第一次出现值的行号?
【发布时间】:2020-04-23 20:49:22
【问题描述】:

我有一个如下的 CSV 文件:

E   Run 1   Run 2   Run 3   Run 4   Run 5   Run 6   Mean
1   0.7019  0.6734  0.6599  0.6511  0.701   0.6977  0.680833333
2   0.6421  0.6478  0.6095  0.608   0.6525  0.6285  0.6314
3   0.6039  0.6096  0.563   0.5539  0.6218  0.5716  0.5873
4   0.5564  0.5545  0.5138  0.4962  0.5781  0.5154  0.535733333
5   0.5056  0.4972  0.4704  0.4488  0.5245  0.4694  0.485983333

我正在尝试使用查找最后一列的值低于某个范围的行号。比如下面0.6

使用上面的 CSV 文件,我想返回3,因为E = 3Mean <= 0.60 所在的第一行。如果0.6 以下没有值,我想返回0。我实际上是根据最后一列返回第一列中的值。

我计划将此数字初始化为gnuplot 中的常量。如何才能做到这一点?我标记了awk,因为我认为它是相关的。

【问题讨论】:

    标签: bash awk gnuplot


    【解决方案1】:

    如果您想要 gnuplot-only 版本...如果您使用文件删除数据块并将 $Data 替换为 " " 中的文件名。

    reset session
    
    $Data <<EOD
    E   Run 1   Run 2   Run 3   Run 4   Run 5   Run 6   Mean
    1   0.7019  0.6734  0.6599  0.6511  0.701   0.6977  0.680833333
    2   0.6421  0.6478  0.6095  0.608   0.6525  0.6285  0.6314
    3   0.6039  0.6096  0.563   0.5539  0.6218  0.5716  0.5873
    4   0.5564  0.5545  0.5138  0.4962  0.5781  0.5154  0.535733333
    5   0.5056  0.4972  0.4704  0.4488  0.5245  0.4694  0.485983333
    EOD
    
    set table $Dummy
        plot E=flag=0 $Data u ($8<=0.6 && flag==0 ? (E=$1, flag=1) : 0) w table
    unset table
    
    print E
    

    结果:

    3.0
    

    【讨论】:

    • 更短:plot E=0 $Data u ($8&lt;=0.6 &amp;&amp; E==0 ? E=$1 : 0)
    • @Friedrich,对,我忽略了这个...您可以将E 本身用作标志...
    【解决方案2】:

    另一个 awk。您可以在 BEGIN 中将默认返回值初始化为 var ret,但由于它为 0,因此实际上没有意义,因为空 var+0 会产生相同的效果。如果在达到END 之前未达到阈值 0.6,则返回该值。如果满足,exit 调用END 并输出ret

    $ awk '
    NR>1 && $NF<0.6 {    # final column has a value below a certain range
        ret=$1           # I want to return 3 because E = 3
        exit
    }
    END {
        print ret+0
    }' file
    

    输出:

    3
    

    【讨论】:

    • 如果您将print ret 更改为print ret+0,您可以去掉BEGIN 部​​分。
    【解决方案3】:

    这样的事情应该可以解决问题:

    awk 'NR>1 && $8<.6 {print $1;fnd=1;exit}END{if(!fnd){print 0}}' yourfile
    

    【讨论】:

    • 或更好:'NR&gt;1 &amp;&amp; $NF&lt;.6 {n=$1;exit} END{print n+0}'
    • 这总是返回零;可能是因为列名是第一行吗?也许它将“平均”读作&lt;0.6
    • 当您说“返回零”时,您的意思是“输出 0”还是“以状态 0 退出”? Unix工具不会“返回”任何东西(或者如果他们这样做了,那么他们“返回”实际上是他们的退出状态,因为shell函数中使用了关键字来设置它们的退出状态),它们只是产生输出并设置一个退出状态,所以我只是想确定你的意思是什么,因为我看不到该脚本如何总是输出 0,但它总是以状态 0 退出。
    • @EdMorton 我想我不确定。控制台的输出是0,这是否意味着退出代码0awk 输出0,不确定。无论如何,我可以通过在awk 之后添加-F "\"*,\"*" 来解决它。事实证明它没有处理逗号。
    • @EdMorton 你是对的,我应该更具声明性。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多