【问题标题】:Awk Conditional Test Statementawk 条件测试语句
【发布时间】:2010-11-09 22:30:49
【问题描述】:

非常感谢您的帮助。我几乎花了整个上午的时间。

我有一个结构字段1到16的数据如下

4572 1307084940 RDCSWE 2006 1 5 0.28125 0.5 0.125 0.09375 0 0 0 0 0 0
4573 1307101627 RDCSWE 2006 1 5 0.6875 0.125 0.1875 0 0 0 0 0 0 0
4574 1307101642 RDCSWE 2006 1 5 0.5625 0.25 0.03125 0.15625 0 0 0 0 0 0
4575 1307101662 RDCSWE 2006 1 5 0.53125 0.25 0.1875 0.03125 0 0 0 0 0 0
4576 1307127329 RDCSWE 2006 1 5 0.4375 0.34375 0.09375 0.125 0 0 0 0 0 0

从字段 7 到 10 我需要对元素(范围从 0-1)和字段编号进行测试。
即对于每条记录,检查字段 7-10 的最大值,

如果找到并且其在字段 7 中打印 $0, $6-4
如果找到并且其在字段 8 中打印 $0, $6-3
如果找到并且其在字段 9 中打印 $0, $6-2
如果找到并且其在字段 10 中打印 $0, $6-1

我将非常感谢您的帮助。提前谢谢你

编辑(由贝利撒留)

只是抄录@Tumi2002(作者)的评论

抱歉,我的第 6 个字段(即 $6)的值是 1-5。
我正在尝试将字段 6=5 的记录重新分类为同一字段中的 1-4 个类)。
所以我有 4 个而不是 5 个类。

Awk '$6==5 
{for i=7; i<11; i++) 
 if ($i==max) && NF==7)  print $0,$6-4;
 if ($i==max) && NF==8)  print $0,$6-3;
 if ($i==max) && NF==9)  print $0,$6-2; 
 if ($i==max) && NF==10) print $0,$6-1

我正在为 awk 中的语法苦苦挣扎

【问题讨论】:

  • 您可以编辑问题以方便阅读...
  • 抱歉,我的第 6 个字段(即 $6)的值为 1-5。我正在尝试将字段 6=5 的记录重新分类为同一字段中的 1-4 个类)。所以我有 4 个而不是 5 个类。awk '$6==5 {for i=7;我
  • 我正在为 awk 中的语法苦苦挣扎
  • 编辑您的问题,而不是发布修改其内容的 cmets

标签: awk


【解决方案1】:
{
 max=0; maxindex=0;
 for (i=7; i<=10; i++)
 {
  if ($i>max){
          maxindex=i;
          max=$i;
          # print i;
         }
 }
 if (maxindex > 0){
         print $6-11+maxindex;
         }
}  

ideone运行

示例数据的输出:

2
1
1
1
1

编辑

修改回答您的评论:

($6 == 5){
       max=0; maxindex=0;
       for (i=7; i<=10; i++)
       {
        if ($i>max){
          maxindex=i;
          max=$i;
          # print i;
        }
       }
       if (maxindex > 0){
         print $0,"-->",$6-11+maxindex;
          }
 }

输出:

4572 1307084940 RDCSWE 2006 1 5 0.28125 0.5 0.125 0.09375 0 0 0 0 0 0 --> 2
4573 1307101627 RDCSWE 2006 1 5 0.6875 0.125 0.1875 0 0 0 0 0 0 0 --> 1
4574 1307101642 RDCSWE 2006 1 5 0.5625 0.25 0.03125 0.15625 0 0 0 0 0 0 --> 1
4575 1307101662 RDCSWE 2006 1 5 0.53125 0.25 0.1875 0.03125 0 0 0 0 0 0 --> 1
4576 1307127329 RDCSWE 2006 1 5 0.4375 0.34375 0.09375 0.125 0 0 0 0 0 0 --> 1  

跑在ideonehere

【讨论】:

  • @Zsolt 是的。对于短代码sn-ps,它很棒。我也在 SO 中了解了它。很高兴传播这个消息。
  • 非常感谢。它就像一个魅力!我很抱歉弄得一团糟。我简直太绝望了。你拯救了我的一天。我只需要对我有 0.5 0.5 的实例进行 1 次小编辑。再次感谢您:)
  • @Tumi2002 很高兴为您提供帮助。请记住,如果您在 StackOverflow 上获得的答案有用,您可以投票。如果他们中的某个人以某种方式解决了您的问题,您应该接受答案以表明问题已解决。如果您不接受答案,其他用户就会开始失去帮助您的兴趣。
【解决方案2】:

首先,感谢belisarius 指向ideone

我的(更新的)解决方案是working correctly now

# max value in an array, copied verbatim from the gawk manual (credit)
function maxelt(vec,   i, ret)
 {
      for (i in vec) {
           if (ret == "" || vec[i] > ret)
                ret = vec[i]
      }
      return ret
 }

# Load all fields of each record into nums.
{
     delete nums
     for(i = 7; i <= 10; i++)
          { nums[NR, i] = $i }
     ### DEBUG print NR, maxelt(nums)
     if ( $7 == maxelt(nums) ) { print $0, ($6-4) } 
     if ( $8 == maxelt(nums) ) { print $0, ($6-3) } 
     if ( $9 == maxelt(nums) ) { print $0, ($6-2) } 
     if ( $10 == maxelt(nums) ) { print $0, ($6-1) } 
}

HTH

【讨论】:

  • function maxelt(vec, i, ret) { for (i in vec) { if (ret == "" || vec[i] > ret) ret = vec[i] } return ret } # 将每条记录的所有字段加载到 nums 中。 { for(i = 7; i test.dat2
  • 我有 2 行语法错误 ./class.sh: 第 43 行:意外标记附近的语法错误 vec,' ./class.sh: line 43: function maxelt(vec, i, ret)'
  • 能否请您使用 gist.github.com 进行代码粘贴(在评论文件中)?告诉我们您使用的是什么版本的 awk?
  • 我得到了解决方案的代码。感谢 gist.github.com 的提示。下次我会记住这一点的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2013-10-20
  • 2020-09-13
相关资源
最近更新 更多