unix520 发表于 2023-08-04 21:25

总时间

本帖最后由 unix520 于 2023-08-04 21:27 编辑

哈喽大家好
由于一个名称分成了很多行记录, 需要统计出所有名称相同总时间,    即会变成1个名称总时间   没有名称相同的也需要输出原数据         最大单位使用小时   精确到 时 分 秒
分隔符是 "\t"       第1列是名称               第3列时间   


老6      ID      1h:2m:59s
张三      ID      0h:10m:00s
李4      ID      0h:07m:07s
老6      ID      0h:01m:02s
老6      ID      0h:2m:59s
张三      ID      2h:11m:01s
王五      ID      0h:0m:01s

喜欢awk

本友会机友会摄友会 发表于 2023-08-05 13:55

unix520 发表于 2023-08-07 15:59

本帖最后由 unix520 于 2023-08-07 16:05 编辑

回复 2# 本友会机友会摄友会

直接处理不行吗要转一次csv 这么繁琐吗,   但为什么执行后变多了,,似乎并没有统加起来,,,用的ps1,   看的头晕   可以写完整的试试吗Set-Location ${PSScriptRoot}

#1 把不规范的txt,处理成规范的csv
$csv = Get-Content -LiteralPath "${PSScriptRoot}20230805in.txt" | ForEach-Object {
      $_ -replace ' +',','
} | ConvertFrom-Csv -Header 'a','b','c'
$csv

$根据第一列分组 = $csv | Group-Object -Property 'a'
# group-object是一个数组,属性有:
# 数组属性有:g.name ,g.count,g.group

foreach ($i in $根据第一列分组) #遍历分组
{
      $时间累加 = $null
      foreach ($i2 in $i.Group) #遍历分组内的第3列的每一个值
      {
                $i3 = $i2.c -replace '' -as
                $时间累加 += $i3
      }
      '{0} {1}' -f $i2.a,$时间累加 #输出结果
}

a                b c
-                - -
老6      ID      1h:2m:59s   
张三      ID      0h:10m:00s   
李4      ID      0h:07m:07s   
老6      ID      0h:01m:02s   
老6      ID      0h:2m:59s   
张三      ID      2h:11m:01s   
王五      ID      0h:0m:01s   
老6      ID      1h:2m:59s
张三      ID      0h:10m:00s
李4      ID      0h:07m:07s
老6      ID      0h:01m:02s
老6      ID      0h:2m:59s
张三      ID      2h:11m:01s
王五      ID      0h:0m:01s



本友会机友会摄友会 发表于 2023-08-09 10:40

unix520 发表于 2023-08-10 09:43

本帖最后由 unix520 于 2023-08-10 09:52 编辑

回复 4# 本友会机友会摄友会

我使用win10 22h2 最新系统自带PowerShell版本,执行上面2楼代码一闪而过, 不知道某些代码是不是让网页吃了对PowerShell有些陌生,看到老师发了100多文章,但都是中上知识编码难度,老师可以发一些非常简单PowerShell代码使用示例吗。例如输入文件有几种方法,输出文件又有几种方法,
另外希望老师发一些高速去重复行代码示例,处理文本列等示例,一些简单常用讲解文章。

unix520 发表于 2023-08-10 22:28

回复 4# 本友会机友会摄友会
执行你脚本后输入和输出一样


baby_神 发表于 2023-08-11 10:24

本帖最后由 baby_神 于 2023-08-11 10:32 编辑

      awk -F '[:\t ]+' '{         
    name = $1
    time = $3 * 3600 + $4 * 60 + $5
    total_time += time
}
END {
    for (name in total_time) {
      printf "%s\t%dh:%dm:%ds\n", name, total_time / 3600, (total_time % 3600) / 60, total_time % 60
    }
}' filename

unix520 发表于 2023-08-11 11:10

回复 7# baby_神

谢谢老师,写的非常优美

wh7211 发表于 2023-08-29 12:34

回复 1# unix520

unix520你好:
下面你发表的主题中均有大家给你的回复,而你却把1楼提问帖的内容修改成了如“谢谢”、“算了 不问了”、“新年快乐”等内容。大家回复帮你解决问题是要耗费时间和精力的,你这样做是对回复人的不尊重,也让该主题失去了参考价值。请恢复这些主题中1楼提问帖的内容。

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319222
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319242
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319228
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319296


unix520 发表于 2023-08-29 13:28

回复 9# wh7211

没有不尊重意思,   请不要误会哦, 如有一些不当之处,实在抱歉, 希望大家谅解。已全部更正及还原主题意思
页: [1] 2
查看完整版本: 总时间