linux - 不使用 awk 编写 bash 脚本?

我们被要求编写一个shell 脚本,它将玩家记录的输入作为标准输入。

示例输入:

id|name|time
23|Jordan|45:17
14|Jason|4:50
12|Bryan|
24|Cody|00:12
33|kobe|41
55|rocky|0

并且我们需要读取我们脚本中的每个记录(跳过标题),然后输出每个相应的通过转换以秒为单位的时间并将分隔符'|'更改为''记录>(空格)。

正如我们在上面的示例测试用例中看到的,一些记录有空时间字段(第三条记录),对于那些记录以秒为单位的时间将被视为0

示例案例输出:

23 Jordan 2717
14 Jason 290
12 Bryan 0
24 Cody 12
33 kobe 2460
55 rocky 0

my_solution_script.sh

#!/bin/bash


read -r header
while IFS="|" read -r pid pname time || [[ -n $pid ]]
do  
    min=$(cut -d ':' -f 1 <<< "$time")
    sec=$(cut -d ':' -f 2 <<< "$time")
    ((min*=60))
    ((min+=sec))
    
    echo "$pid $pname $min"
done

错误的输出:

23 Jordan 2717
14 Jason 290
12 Bryan 0
24 Cody 12
33 kobe 2501
55 rocky 0

如我们所见,上面的脚本为第 5 条记录提供了错误的输出

How can I fix the above script, to get the correct output in every case?

我认为使用 awk 可能有更简单的解决方案,但我现在对“awk 脚本” 不太了解, 所以我正在寻找一种使用基本 shell 命令 来解决这个问题的方法,不过也欢迎使用 awk 命令 解决方案。

谢谢。

最佳答案

问题是 cut -d: -f2 <<< "$time"返回所有 $time当它不包含 : 时定界符。所以对于科比,你正在计算 41*60+41而不仅仅是 41*60 .

所以你需要检查是否$time包含 :在尝试获取秒数之前。

read -r header
while IFS="|" read -r pid pname time || [[ -n $pid ]]
do  
    min=$(cut -d ':' -f 1 <<< "$time")
    if [[ $time =~ : ]]
        sec=$(cut -d ':' -f 2 <<< "$time")
    else
        sec=0
    fi
    ((min*=60))
    ((min+=sec))
    
    echo "$pid $pname $min"
done

https://stackoverflow.com/questions/63693884/

相关文章:

python - Tensorflow 中哪些层受 dropout 层的影响?

clojure - "let"的功能替代

python - 变量和参数有什么区别

Haskell - 如何将矩阵(二维数组)分成几组

reactjs - 使用 `new` 关键字作为参数的 useState

swift - 在 RealityKit 中启用手势

scala - 为什么案例模式匹配匿名函数可以有两个签名,并且具有神奇的调用站点兼容性

swift - iOS-14 netServiceBrowser.searchForServices

r - 按列计算唯一值

python - 如何将字符串拆分为大小相等的部分?