awk在第一个字段中替换字符串的一部分

时间:2014-10-10 09:47:18

标签: shell date awk

请注意,我的文件包含以字符|分隔的字段,第一列包含日期和小时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 }'

谢谢

6 个答案:

答案 0 :(得分:3)

您可以通过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|

答案 1 :(得分:1)

sed 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\)[^|]*/\3\2\1000000/'

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:1)

由于这是关于处理日期,我会使用一个小的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|

答案 4 :(得分:0)

$ 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|

答案 5 :(得分:0)

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|