awk 条件测试语句

发布于 2024-10-01 00:11:04 字数 1095 浏览 1 评论 0原文

我真的很感激一些帮助。我几乎花了整个上午的时间。

我有结构字段 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

我将非常感谢您的帮助。预先感谢您

编辑(由belisarius)

只是转录@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 中的语法上苦苦挣扎

I would really appreciate some help. I spent almost the whole morning on it.

I have a data of structure field 1 to 16 as follows

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

From field 7 to 10 I need a test on the elements (ranging fro 0-1) and the field number.
i.e. for every record, check the fields 7-10 for maximum value,

if found and its in field 7 print $0, $6-4
if found and its in field 8 print $0, $6-3
if found and its in field 9 print $0, $6-2
if found and its in field 10 print $0, $6-1

I'll be so grateful for the help. Thank you in advance

Edit (by belisarius)

Just transcripting a comment from @Tumi2002 (author)

Sorry, my 6th field (i.e. $6) has values 1-5.
I am trying to reclassify records where field 6=5 back into 1-4 classes in the same fieid).
So that instead of 5 classes I have 4.

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

I am struggling with the syntax in awk

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风为裳 2024-10-08 00:11:04
{
 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  

在 ideone 上运行此处

{
 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;
         }
}  

Running at ideone

Output for your example data:

2
1
1
1
1

Edit

Modified answering your comment:

($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;
          }
 }

Output:

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  

Running at ideone here

时间海 2024-10-08 00:11:04

首先,感谢 belisarius 指向 ideone

我的(更新的)解决方案现在可以正常工作

# 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

First of all, thanks for belisarius for pointing to ideone.

My (updated) solution is 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文