Поиск записей с помощью команды awk по математике - PullRequest
1 голос
/ 19 июня 2020

Напишите команду unix, чтобы отобразить все поля учащихся , набравших более 80 баллов по математике, а также баллы по математике должны быть наивысшими баллами среди всех предметов, кроме того, выходные данные должны быть в порядке возрастания std ( стандарт) студентов .

ВХОД:

roll,name,std,science_marks,math_marks,college
1,A,9,60,86,SM
2,B,10,85,80,DAV
3,C,10,95,92,DAV
4,D,9,75,92,DAV

ВЫХОД:

1|A|9|60|86|SM
4|D|9|75|92|DAV

myCode:

awk 'BEGIN{FS=',' ; OFS="|"} {if($4<$5 && $5>80){print $1,$2,$3,$4,$5,$6}}'

но я У меня неожиданная ошибка токена, помогите мне, пожалуйста.

    Error Message on my Mac System Terminal:
awk: syntax error at source line 1
     context is
        BEGIN >>>  {FS=, <<< 
    awk: illegal statement at source line 1

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Ваш код содержит двойные кавычки неправильной кодировки:

                        here
                        | |
                        v v
$ busybox awk 'BEGIN{FS=”,” ; OFS="|"} {if($4<$5 && $5>80){print $1,$2,$3,$4,$5,$6}}'
awk: cmd. line:1: Unexpected token

Замените их, и ваш код работает нормально.

2 голосов
/ 19 июня 2020

Не могли бы вы попробовать следовать, написано и протестировано на показанных примерах в GNU awk. В этом ответе нет жесткого кодирования номера поля, в котором он собирает столбец, в котором есть математика, и соответственно проверяет остальные строки.

awk '
BEGIN{
  FS=","
  OFS="|"
}
FNR==1{
  for(i=1;i<=NF;i++){
    if($i=="math_marks"){ field=i }
  }
  next
}
{
  for(i=3;i<=(NF-1);i++){
    max=(max>$i?(max?max:$i):$i)
  }
  if(max==$field && $field>80){ $1=$1; print }
  max=""
}
'  Input_file

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

awk '                                               ##Starting awk program from here.
BEGIN{                                              ##Starting BEGIN section of code here.
  FS=","                                            ##Setting field separator as comma here.
  OFS="|"                                           ##Setting output field separator as | here for all lines.
}
FNR==1{                                             ##Checking condition if its first line then do following.
  for(i=1;i<=NF;i++){                               ##Going through all fields here.
    if($i=="math_marks"){ field=i }                 ##Checking if a field value is math_marks then set field to tht field numner here.
  }
  next                                              ##next will skip all further statements from here.
}
{
  for(i=3;i<=(NF-1);i++){                           ##Going through from 3rd field to 2nd last field here.
    max=(max>$i?(max?max:$i):$i)                    ##Creating max variable which checks its value with current field and sets maximum value by comparison here.
  }
  if(max==$field && $field>80){ $1=$1; print }      ##After processing of all fields checking if maximum and field value is equal AND math number field is greater than 80 then print the line.
  max=""                                            ##Nullifying max var here.
}
'  Input_file                                       ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...