如何在文本输出中间输入从 awk 派生的总和

如何在文本输出中间输入从 awk 派生的总和

我正在尝试在一行中间打印一个总和。我的脚本提示输入用户名,然后从文件中提取该用户的进程总数和总时间。

我想打印一个句子,总数位于句子的中间。

使用awk我可以获得进程和分钟的总数,但无法在句子中间打印方程式的结果。我的方程的结果显示在句子后面。

我觉得我需要像 HTML 中那样使用锚点。我正在使用腻子。

 oliver|Login|100
 smith|Login|20
 oliver|Time|25
 oliver|Time|25
 smith|Time|20
 Anne|Login|100

Example: User name? oliver
oliver has run 3 processes for a total of 150 minutes

 case $choice" in
   1) echo -n "User name?"
    read username
    echo "$username has run processes for a total of minutes"
    ;;

我想获得输入的特定用户名的进程总数和分钟数。然后将这些数字插入到它们所属的句子中。

答案1

以下脚本从命令行而不是提示符获取其参数。这使得从其他脚本中重用变得更容易,并允许用户指定多个用户名。

$ cat jake.sh 
#! /bin/sh

inputfile='input.txt'

for u in "$@" ; do
    awk -F'|' -v u="$u" '$1 == u { sum = sum + $3 ; count++} 
        END {print u " has run " count " processes for a total of " \
             sum " minutes."}' < "$inputfile"
done

请注意 shell 脚本如何$u通过选项将 shell 变量传递给 awk 脚本-v u="$u"。这避免了必须在 awk 脚本周围使用双引号才能直接使用 shell $u...因为这需要使用反斜杠转义 awk 脚本中的每个$1, $3, 和 every实例。"\

输入与您的示例中的相同:

$ cat input.txt 
oliver|Login|100
smith|Login|20
oliver|Time|25
oliver|Time|25
smith|Time|20
Anne|Login|100

这是输出:

$ ./jake.sh oliver smith Anne
oliver has run 3 processes for a total of 150 minutes.
smith has run 2 processes for a total of 40 minutes.
Anne has run 1 processes for a total of 100 minutes.

如果您确实希望它提示输入用户名,则脚本将如下所示:

#! /bin/sh

inputfile='input.txt'

echo -n "User name?"
read username

awk -F'|' -v u="$username" '$1 == u { sum = sum + $3 ; count++} 
    END {print u " has run " count " processes for a total of " \
         sum " minutes."}' < "$inputfile"

相关内容