A UNIX Команда для поиска имени студента, у которого второй наивысший балл - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в Unix Программировании. Не могли бы вы помочь мне решить вопрос. Например, если входной файл имеет следующее содержимое:

RollNo Name Score
234 ABC 70
567 QWE 12
457 RTE 56
234 XYZ 80
456 ERT 45

Результат будет

ABC

Я пробовал что-то вроде этого

sort -k3,3 -rn -t" " | head -n2 | awk '{print $2}'

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Использование awk

awk 'NR>1{arr[$3]=$2} END {n=asorti(arr,arr_sorted);  print  arr[arr_sorted[n-1]]}'

Демо:

$cat file.txt 
RollNo Name Score
234 ABC 70
567 QWE 12
457 RTE 56
234 XYZ 80
456 ERT 45
$awk 'NR>1{arr[$3]=$2} END {n=asorti(arr,arr_sorted);  print  arr[arr_sorted[n-1]]}'  file.txt 
ABC
$

Пояснение:

NR>1 -> Пропустить первую запись

{arr[$3]=$2} -> Создать ассоциативный массив с пометками как индекс и имя как значение

END <- читать до конца файла </p>

n=asorti(arr,arr_sorted) <- Сортировать массив <code>arr по значению индекса (т.е. отметкам) и сохранить в arr_sorted. n = количество элементов в массиве

print arr[arr_sorted[n-1]]} <- <code>n-1 будет указывать на второе последнее значение в arr_sorted (т.е. метки) и печатать соответствующее значение из arr

0 голосов
/ 06 мая 2020

Ваша попытка на 90% верна, всего одно изменение Попробуйте это ... это сработает.

sort -k3,3 -rn -t "" | голова -n1 | awk '{print $ 2}'

Вместо использования head -n2 замените его на head -n1

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