【问题标题】:Grab similar data and do the math operation on the grabbed data抓取相似的数据,对抓取的数据做数学运算
【发布时间】:2021-11-16 14:49:59
【问题描述】:

我需要从下表中搜索每个学生的出勤值,并需要对每个学生的出勤率进行求和。

我在 file_dump.txt 中有一个包含以下数据的文件转储

 [days   Leaves PERCENTAGE  student_attendance]
   194     1.3  31.44%      student1.entry2
   189     1.3  30.63%      student2._student2
   138     0.9  22.37%      student3.entry2
     5     0.0   0.81%      student3._student3
     5     0.0   0.81%      student1._student1

我需要使用linux命令(grep或其他命令)从上表中搜索student1数据,然后将student1.entry2和student1._student1相加,即(194 + 5 = 199)。

如何使用 linux 命令行来做到这一点?

【问题讨论】:

    标签: shell grep


    【解决方案1】:

    Awk 非常适合像这样的小型编程任务。

    awk -v student="student1" '$4 ~ "^" student "\." { sum += $1 }
        END { print sum }' file
    

    -v 选项允许您从命令行为 Awk 变量传递一个值;我们这样做是为了给变量student 提供一个值。第一行检查第四个字段$4 是否以该变量开头,紧跟一个点,如果是,则将第一个字段$1 添加到变量sum。 (方便地,未初始化的变量会以默认值零/空字符串的形式出现。)对于文件中的每个输入行都会重复此操作。然后END块在输入文件耗尽后被执行,我们打印累加和。

    如果您想将其保存在可执行脚本中,您可能希望允许调用者指定要搜索的学生:

    #!/bin/sh
    # Fail if $1 is unset
    : ${1?Syntax: $0 studentname}
    awk -v student="$1" '$4 ~ "^" student "\." { sum += $1 }
        END { print sum }' file
    

    注意单引号内的 $ 变量是 Awk 字段名称(单引号保护脚本的内容免受 shell 的变量插值等设施的影响),而带有双引号的变量被 shell 替换为第一个命令行参数的值。

    【讨论】:

    • 感谢@tripleee 的回答。你能告诉我如何在make文件中写同样的东西吗?我需要包含所有学生出勤信息的 result.txt 文件中的最终输出。我需要在 make 文件中添加此逻辑。
    • cut -c 1- file_dump.txt | awk -v student="student1" '$4 ~ "^" student "\." { sum += $1 } END { print sum }' file_dump.txt
    • 你不需要那里的cut,Awk 也可以很好地做到这一点(但cut -c1- 实际上并没有执行任何有用的功能)。当您希望它从管道中读取时,您不会将文件名参数传递给 Awk。 Makefile 的主要内容是将美元符号加倍。
    • 在评论中添加新要求在这里是不可接受的。接受此答案(或发布您自己的答案并接受,如果您愿意,另请参阅help),如果您无法弄清楚,请提出一个新问题。 (但可能与stackoverflow.com/questions/42572446/how-to-use-awk-in-makefile 重复)
    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2017-09-04
    • 2020-01-13
    • 2011-11-06
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多