Awk Условное испытание - PullRequest
       2

Awk Условное испытание

0 голосов
/ 09 ноября 2010

Буду очень признателен за помощь.Я потратил на это почти все утро.

У меня есть данные структурного поля с 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 класса в том же разделе).
Так что вместо 5 классов у меня есть 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

Я борюсь с синтаксисом в awk

Ответы [ 2 ]

1 голос
/ 09 ноября 2010
{
 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  

Бег в идеоне здесь

0 голосов
/ 09 ноября 2010

Прежде всего, спасибо за 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...