我正在尝试在一行中间打印一个总和。我的脚本提示输入用户名,然后从文件中提取该用户的进程总数和总时间。
我想打印一个句子,总数位于句子的中间。
使用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"