【问题标题】:how to use shell to split string into correct format?如何使用 shell 将字符串拆分为正确的格式?
【发布时间】:2016-07-22 18:59:55
【问题描述】:

我有这个持续时间的文件。有些人有几天,但主要是 hh:mm 形式。整个形式为dd+hh:mm 我试图将“tr -s '+:' ':'”它们转换为 dd:hh:mm 形式,然后 split($1,tm,":") 将它们计算为秒。 但是,我面临的问题是,在此操作之后,带有 hh:mm 的表单将在 tm[1] 中具有 hh,但如果它的 dd:hh:mm 则 tm[1] 将是 dd。 有没有办法将 hh:mm 形式的 hh 放入 tm[2] 并将 tm[1] 为 0 请?

4+11:26 
10+06:54 
20:27

是输入

我想要的输出是(以 tm[1], tm[2], tm[3] 的形式):

4 11 26 
10 06 54 
0 20 27

【问题讨论】:

  • 请显示您有什么输入和您期望的输出。
  • 刚刚添加。谢谢你提醒我!
  • 我会首先尝试通过插入缺失的日期来规范化输入,然后在 sed 中继续:sed '/+/! s/^/0+/; s/[+:]/ /g;' yourfile
  • 确实有效!非常感谢!

标签: linux bash shell awk command-line


【解决方案1】:

我将首先使用 sed 对其进行预处理(在没有加号的行中添加缺少的 0+),然后将 tr +: 添加到空格:

cat a.txt | sed 's/^\([^+]\+\)$/0+\1/g' | tr  '+:' '  '

或者按照 Lars 的建议,更短的 sed 版本:

cat a.txt | sed '/+/! s/^/0+/;' | tr  '+:' '  '

【讨论】:

    【解决方案2】:

    awk 来救援!

    您可以在awk 中进行转换和计算,使用您的输入文件将值转换为分钟

    $ awk -F: '{if($1~/+/){split($1,f,"+");h=f[1]*24+f[2]}
                else h=$1; m=h*60+$2; print $0 " --> " m}' file
    
    4+11:26  --> 6446
    10+06:54  --> 14814
    20:27 --> 1227
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2013-09-11
      • 2015-08-22
      • 2017-12-21
      相关资源
      最近更新 更多