【问题标题】:awk replace part of string in first fieldawk 替换第一个字段中的部分字符串
【发布时间】:2014-10-10 09:47:17
【问题描述】:

请,我有一个文件,其中包含由字符| 分隔的字段,第一列包含日期和时间2014-10-09/10:00:00.00。这是文件:

2014-10-09/10:01:00.27|  tha|  99|  awfkj|             kiuaj|   oauhhg|
2014-10-09/10:02:49.00|  okh|  69|  azakj|             wklkj|   hjjhhg| 
2014-10-09/10:15:30.06|  hnt|  19|  klkkj|             kjhkj|   okjhhg|

我想改变日期的格式,把小时换成“000000”,应该是这样的:

09102014000000|  tha|  99|  awfkj|             kiuaj|   oauhhg|
09102014000000|  okh|  69|  azakj|             wklkj|   hjjhhg| 
09102014000000|  hnt|  19|  klkkj|             kjhkj|   okjhhg|

我不知道我需要使用什么。比如这个?

awk '{ gsub("..", "..", $1) ; print }'

谢谢

【问题讨论】:

    标签: shell date awk


    【解决方案1】:

    你可以通过 sed 简单地做到这一点,

    GNU sed,

    $ sed -r 's~^([0-9]{4})-([0-9]{2})-([0-9]{2})[^\|]*~\3\2\1000000~' file
    09102014000000|  tha|  99|  awfkj|             kiuaj|   oauhhg|
    09102014000000|  okh|  69|  azakj|             wklkj|   hjjhhg| 
    09102014000000|  hnt|  19|  klkkj|             kjhkj|   okjhhg|
    

    基本的 sed,

    $ sed 's~^\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)[^\|]*~\3\2\1000000~' file
    09102014000000|  tha|  99|  awfkj|             kiuaj|   oauhhg|
    09102014000000|  okh|  69|  azakj|             wklkj|   hjjhhg| 
    09102014000000|  hnt|  19|  klkkj|             kjhkj|   okjhhg|
    

    【讨论】:

      【解决方案2】:
      sed 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\)[^|]*/\3\2\1000000/'
      

      【讨论】:

        【解决方案3】:

        试试这个:

        sed 's/^\(....\)-\(..\)-\(..\)\/\(..:..:.....\)/\3\2\1000000/' input.txt
        

        【讨论】:

          【解决方案4】:

          由于这是关于处理日期,我会使用一个小的 bash 脚本并调用 date 命令。这样,您可以随意调整它,只需使用date 格式选项:

          while IFS="|" read -r a b
          do
              a=$(date -d"${a%/*}" +"%d%m%Y")
              echo "${a}000000| $b"
          done < file
          

          a=$(date -d"${a%/*}" +"%d%m%Y") 获取第一个文本块,从斜杠中删除 / 并将其转换为格式为 DDMMYYYY 的日期。

          测试

          $ while IFS="|" read -r a b; do a=$(date -d"${a%/*}" +"%d%m%Y"); echo "${a}000000| $b"; done < file
          09102014000000|   tha|  99|  awfkj|             kiuaj|   oauhhg|
          09102014000000|   okh|  69|  azakj|             wklkj|   hjjhhg| 
          09102014000000|   hnt|  19|  klkkj|             kjhkj|   okjhhg|
          

          【讨论】:

            【解决方案5】:
            $ sed -r 's/(^[0-9]{4})-([0-9]{2})-([0-9]{2}).{13}/\3\2\1000000|/g'
            
            09102014000000|  tha|  99|  awfkj|             kiuaj|   oauhhg|
            09102014000000|  okh|  69|  azakj|             wklkj|   hjjhhg|
            09102014000000|  hnt|  19|  klkkj|             kjhkj|   okjhhg|
            

            【讨论】:

              【解决方案6】:

              gawk具体方式

              awk '{a=gensub(/(.+)-(.+)-(.+)(\/.+)/,"\\3\\2\\1000000","g",$1);sub($1,a);print}' input.txt
              

              输出:

              09102014000000|  tha|  99|  awfkj|             kiuaj|   oauhhg|
              09102014000000|  okh|  69|  azakj|             wklkj|   hjjhhg| 
              09102014000000|  hnt|  19|  klkkj|             kjhkj|   okjhhg|
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-11-05
                • 2014-08-04
                • 1970-01-01
                • 2011-03-25
                相关资源
                最近更新 更多