这个shell 脚本为我提供了最大值和最小值,但我希望在出现重复时获得这些值和相关的学生.

代码:

#!/bin/sh
Notamax=0
Notamin=0
alumneMax=''
alumneMin=''
while IFS=";" read alumne nota
do
    (( nota > Notamax )) && Notamax=$nota alumneMax=$alumne
    (( nota < Notamin || Notamin == 0)) && Notamin=$nota alumneMin=$alumne
done <备注.txt备注.txt
echo "Nota maxima $Notamax ** Alumnos con nota maxima: $alumneMax"
echo "Nota minima $Notamin ** Alumnos con nota minima: $alumneMin"

备注.txt备注.txt

pepe;5
marcos;7
marta;70
luis;70
ana;5

实际yields

Nota maxima 70 ** Alumnos con nota maxima: marta
Nota minima  5 ** Alumnos con nota minima: pepe

期望输出

Max: marta 70, luis 70
Min: pepe   5, ana   5

我怎样才能做到这一点?

推荐答案

有了Awk,这就更容易了,也更灵活了.另见Bash while read loop extremely slow compared to cat, why?

awk -F ';' 'NR==1 { min = max = $2; mina = maxa = $1 " " $2; next }
$2==max { maxa = maxa ", " $1 " " $2 }
$2==min { mina = mina ", " $1 " " $2 } 
$2>max { max = $2; maxa = $1 " " $2 }
$2<min { min = $2; mina = $1 " " $2 }
END { print "Max:", maxa
  print "Min:", mina }' notas.txt

您的输出格式有些嘈杂;我个人更喜欢冗余较少且更具机器可读性的显示.

awk tag info page人都有基本学习资源的链接.学习这门语言的基础是又快又容易的(花一个小时,你就已经有了一个好主意).

Linux相关问答推荐

如何告诉链接器不要在链接的共享库中查找某些符号?

如何在Linux下使用正则表达式更改文件名

在具有不同文件类型的文件夹中编辑多个 xml 文件 - 使用预定顺序

删除 csv 列中的不匹配值

awk/sed 命令仅在模式 2 匹配时打印模式 1

编译过度对齐的动态分配变量时出现 icpc 错误

我需要 -D_REENTRANT 和 -pthreads 吗?

Eclipse 的 C# 插件

使用正则表达式时,Shell 'tar: not found in archive' 错误

何时判断 EINTR 并重复函数调用?

让 Tk 看起来像一个原生 Linux 应用程序

exec 系统调用(如 exec 和 execve)系列的功能有什么区别?

在 mac 上通过 ssh 连接到 amazon aws linux 服务器

Linux 中的直接内存访问

linux中netstat和ss的区别?

是否有git sed或类似功能?

/dev/random 非常慢?

如何通过进程名获取PID?

编译 OpenGL 程序 GL/glew.h 缺失

如何查看线程在哪个 CPU 内核中运行?