如何找到列中大于 Linux 中给定数字的元素数?

How do I find the number of elements in a column greater than a given number in Linux?

我有一个带有分数的学生列表的文本文件,我想找出其中有多少人在数学、物理以及数学和物理的总和上获得了 80 以上的成绩。执行此操作的 Linux 命令应该是什么?

文本文件在这里:

#name maths phy
Manila 78 29
Shikhar 49 78
Vandana 65 87
Priyansh 75 22
Bina 52 69
Chitransh 98 93
William 88 73
Kaushal 38 85
Dilruba 65 94
Lalremruata 34 45
Qasim 58 62
Nitya 81 89
Jennita 96 91
Shobha 71 63
Talim 77 88 

这可以使用 awk 来实现(不要使用 grep 因为这不适合数字运算)。一个例子:

cat test.txt | awk '{if (>80 || >80) print  " "  " " }'

这需要改进:如何删除 cat 命令,如何检查两列的总和,为什么标题存在,...?但至少你有一些事情可以开始。

试试这个,并根据您的口味进行调整:

$ awk '/^[^#]/{
    limit = 80;
    comb =  + ;
    if ( > limit &&  > limit)
        print , , , "both";
    else if ( > limit)
        print , , , "maths";
    else if ( > limit)
        print , , , "physics";
    else if (comb > limit)
        print , , , "combined";
}' <<EOF
#name maths phy
Manila 78 29
Shikhar 49 78
Vandana 65 87
Priyansh 75 22
Bina 52 69
Chitransh 98 93
William 88 73
Kaushal 38 85
Dilruba 65 94
Lalremruata 34 45
Qasim 58 62
Nitya 81 89
Jennita 96 91
Shobha 71 63
Talim 77 88 
EOF

产生以下结果:

Manila 78 29 combined
Shikhar 49 78 combined
Vandana 65 87 physics
Priyansh 75 22 combined
Bina 52 69 combined
Chitransh 98 93 both
William 88 73 maths
Kaushal 38 85 physics
Dilruba 65 94 physics
Qasim 58 62 combined
Nitya 81 89 both
Jennita 96 91 both
Shobha 71 63 combined
Talim 77 88 physics

如果您希望从文件中读取它,则将其用作:

$ awk '/^[^#]/{
    limit = 80;
    comb =  + ;
    if ( > limit &&  > limit)
        print , , , "both";
    else if ( > limit)
        print , , , "maths";
    else if ( > limit)
        print , , , "physics";
    else if (comb > limit)
        print , , , "combined";
}' marks.txt

awk 脚本

  • 将阅读第一列中没有 # 的所有行,允许您介绍注释的内容,如带有课程名称的 header。
  • 将允许您轻松配置触发级别,因为限制变量在一个地方初始化并用作常量。
  • 您可以根据自己的要求调整标准,即使是两门课程都没有通过的学生。

注:

如果你想在 awk 脚本中进行变量替换,请注意 awk 使用 $<n> 表示法来引用输入词,shell, 所以你需要做 shell 变量扩展,最好的方法是只在要扩展的变量上关闭单引号并打开双引号,这样你就不会混淆哪个变量会由 shell 扩展,由 awk 扩展。示例:

$ export TRIGGER=95
$ awk '/^[^#]/{
    limit = '"$TRIGGER"';
    comb =  + ;
    if ( > limit &&  > limit)
        print , , , "both";
    else if ( > limit)
        print , , , "maths";
    else if ( > limit)
        print , , , "physics";
    else if (comb > limit)
        print , , , "combined";
}'