首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户上列的Shell和

用户上列的Shell和
EN

Stack Overflow用户
提问于 2018-05-02 19:43:59
回答 3查看 31关注 0票数 0

基本上,我有两个专栏。第一个代表用户,第二个代表他们在服务器上花费的时间。所以我想为每个客户加总,他在服务器上花了多少分钟。

代码语言:javascript
运行
复制
user1 21:03
user2 19:55
user3 20:09
user1 18:57
user1 19:09
user3 21:05
user4 19:57

假设我有这个。我知道怎么分手,但有一个问题。每当我执行awk -F: '{print $1}时,它都会打印用户和时间的第一个参数(:之前的数字),而当我执行awk -F: '{print $2}时,它只会在:之后打印数字。在这么多钱之后,我想弄到

代码语言:javascript
运行
复制
user1 59:09
user2 19:55
user3 41:14
user4 19:57
EN

回答 3

Stack Overflow用户

发布于 2018-05-02 19:54:07

以下是一个可能的解决方案:

代码语言:javascript
运行
复制
perl -ne '/^(\S+) (\d\d):(\d\d)$/ or next; $t{$1} += $2 * 60 + $3; END { printf "%s %02d:%02d\n", $_, $t{$_} / 60, $t{$_} % 60 for sort keys %t }'

或具有更好的格式:

代码语言:javascript
运行
复制
perl -ne '
    /^(\S+) (\d\d):(\d\d)$/ or next;
    $t{$1} += $2 * 60 + $3;
    END {
        printf "%s %02d:%02d\n", $_, $t{$_} / 60, $t{$_} % 60
            for sort keys %t;
    }
'

我们遍历所有输入行(-n)。我们确保每一行都匹配模式\S+ \d\d:\d\d (即由一个或多个非空格字符、一个空格、两个数字、一个冒号、两个数字组成的序列),或者跳过它。

我们在散列%t中累积每个用户的秒数。键是用户名,值是数字。

最后,我们以格式良好的方式打印%t的内容。

票数 0
EN

Stack Overflow用户

发布于 2018-05-03 00:43:24

这是一个awk解决方案

代码语言:javascript
运行
复制
cat 1.txt | awk '{a[$1]+=substr($2,0,2)*60+substr($2,4)} END {for(i in a) printf("%s %02d:%02d\n", i,a[i]/60,a[i]%60)}'
user1 59:09
user2 19:55
user3 41:14
user4 19:57

首先用index=$1构造一个数组,值=将时间转换为整数分钟* 60 +秒

代码语言:javascript
运行
复制
{a[$1]+=substr($2,0,2)*60+substr($2,4)}

然后以所需的格式打印数组,将整数转换为mi:ss格式。

代码语言:javascript
运行
复制
printf("%s %02d:%02d\n", i,a[i]/60,a[i]%60)
票数 0
EN

Stack Overflow用户

发布于 2018-05-03 01:12:58

如果您想要使用awk (并且假设持续时间总是hh:mm,尽管它们的大小可以是任意的),那么下面的操作将起到作用:

代码语言:javascript
运行
复制
{
    split($2, flds, ":")               # Get hours and minutes.
    mins[$1] += flds[1] * 60 + flds[2] # Add to initially zero array item.
}
END {
    for (key in mins) {                # For each key in array.
        printf "%s %d:%02d\n",         # Output specific format.
            key,                       # Key, hours, and minutes.
            mins[key] / 60,
            mins[key] % 60
    }
}

这是扩展的、可读的变体,压缩后的文本显示在下面的文字记录中,以及预期的输出:

代码语言:javascript
运行
复制
pax> awk '{split($2,flds,":");mins[$1] += flds[1] * 60 + flds[2]}END{for(key in mins){printf "%s %d:%02d\n",key,mins[key]/60,mins[key]%60}}' testprog.in

user1 59:09
user2 19:55
user3 41:14
user4 19:57

请记住,当用户条目超过24小时时,您还没有指定输入格式。如果类似于25:42,脚本将按原样工作。

如果它决定将几天(比如1:01:42而不是25:42)分解,那么您需要调整会议记录的计算方法。通过检查flds数组的大小(在脚本的主体中,非END位),这可以相对容易地完成(包括只使用分钟条目的可能性):

代码语言:javascript
运行
复制
num = split($2, flds, ":")
if (num == 1)      { add = flds[1] }
else if (num == 2) { add = flds[1] * 60 + flds[2] }
else               { add = flds[1] * 1440 + flds[2] * 60 + flds[3] }
mins[$1] += add
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50142395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档