В оболочке получить максимальное значение среди всех строк столбца и сравнить его с каждой строкой - PullRequest
0 голосов
/ 13 июля 2020

Мне нужно получить максимальное значение среди всех строк определенного столбца (C2) и сохранить значение в переменной. Допустим, «макс». Затем сравните максимальное значение переменной с каждой строкой, если значение строки больше или равно max, столбец 3 (c3) должен печатать как пройденный, если значение строки меньше максимального значения, которое C3 должен печатать, не удалось. Я написал ниже код, но его выдача прошла для всех. Что не так в моем сценарии?

cat /tmp/test.csv
awk 'BEGIN{ max=0 } {if(($2).max) max=($2)}END {print $1,$2,max}' /tmp/test.csv
cat /tmp/test.csv
awk -F '' 'BEGIN{ OFS=";"; print "sep=;\nPackages;count;maxValue;Validation;'};
{if($2 >= $3)
print $1,$2,$3,"passed"
else
print $1,$2,$3,"failed";}'/tmp/test.csv

my csv file looks:
Vmname   Packages   count   
-----------------
Vm1      a,b,c,d     4
vm2      a,b,c       3
vm3      a,b         2


my expected output is:
   vmname    Packages   count   maxValue  Validation 
    --------------------------------------
    vm1       a,b,c,d     4       4        passed
    vm2       a,b,c       3       4        failed
    vm3       a,b         2       4        failed

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Отредактировано для нового ввода.

awk 'BEGIN{ max=0; i=0; }
     $3+0 > 0 { row[i]=$0; num[i++]=$3; if($3>max){max=$3} }
     END {
       printf "\t%s\n", "vmName   Packages   count   maxValue  Validation\n\t --------------------------------------"
       for (p=0;p<i;p++) { if (num[p]<max) {msg="failed"} else {msg="passed"}
         printf "\t %-25.25s    %d  \t%s\n", row[p],max,msg; } }' test.csv

Это выполняет однократное чтение файла для загрузки ввода и устанавливает max по мере его поступления, печатает заголовок в конце, а затем циклически перебирает массивы ввода чтобы задать для каждого строку «годен / не годен».

Вопросы приветствуются.

Вывод -

    vmName   Packages   count   maxValue  Validation
     --------------------------------------
     Vm1      a,b,c,d     4       4         passed
     vm2      a,b,c       3       4         failed
     vm3      a,b         2       4         failed
1 голос
/ 13 июля 2020

РЕДАКТИРОВАТЬ: Добавление решения после того, как OP упомянул Input_file, он немного изменился только по сравнению с предыдущим.

awk '
FNR==NR{
  if(FNR==1 || FNR==2){ next }
  num=split($0,aray,",")
  max=max>num?max:num
  next
}
FNR==1{
  print $0,"maximum Validation"
  next
}
FNR==2{
  print
  next
}
{
  num=split($0,array,",")
}
{
  print $0,max,max==num?"Passed":"Failed"
}
'  Input_file  Input_file | column -t

Пояснение: Добавление подробного объяснения вышеизложенного.

awk '                                         ##Starting awk program from here.
FNR==NR{                                      ##Checking condition FNR==NR which will be TRUE when first time Input_file is being read.
  if(FNR==1 || FNR==2){ next }                ##Checking if line is 1st or 2nd line then simple skip that line.
  num=split($0,aray,",")                      ##Splitting current line into array named aray with delimiter comma here. Where num will be total nuber of elements in array here.
  max=max>num?max:num                         ##Checking if max is greater than num then keep max value or assign num value to max.
  next                                        ##next will skip all further statements from here onwards.
}
FNR==1{                                       ##Checking condition if FNR==1 its first line then do following.
  print $0,"maximum Validation"               ##Printing current line with maximum and Validation sting here in very first line of Input_file.
  next                                        ##next will skip all further statements from here onwards.
}
FNR==2{                                       ##Checking condition if FNR==2 then do following.
  print                                       ##Printing current line here.
  next                                        ##next will skip all further statements from here onwards.
}
{
  num=split($0,array,",")                     ##Splitting current line into array with delimiter comma and total number of array will be stored into variable num here.
}
{
  print $0,max,max==num?"Passed":"Failed"     ##Printing current line then max and printing passed or failed as per condition here.
}
'  Input_file  Input_file | column -t         ##Mentioning Input_file names here and sending awk program output to column command to arrange it better.

Не могли бы вы попробовать следующее, где я считаю, что ваш Input_file выглядит следующим образом:

cat Input_file
Packages
-------
a,b,c,d
a,b,c
a,b

, тогда следующее решение:

awk '
FNR==NR{
  if(FNR==1 || FNR==2){ next }
  num=split($0,aray,",")
  max=max>num?max:num
  next
}
FNR==1{
  print $0,"count maximum Validation"
  next
}
FNR==2{
  print
  next
}
{
  num=split($0,array,",")
}
{
  print $0,num,max,max==num?"Passed":"Failed"
}
'  Input_file Input_file | column -t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...