老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

简介:

1.题目

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式 

原始数据:

1
2
3
4
5
6
7
8
17 /Apr/2015 :09:29:24 +0800
17 /Apr/2015 :09:30:26 +0800
17 /Apr/2015 :09:31:56 +0800
18 /Apr/2015 :09:34:12 +0800
18 /Apr/2015 :09:35:23 +0800
19 /Apr/2015 :09:23:34 +0800
19 /Apr/2015 :09:22:21 +0800
20 /Apr/2015 :09:45:22 +0800

期望结果:

1
2
3
4
5
6
7
8
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

2.参考答案

思路:

2.1 答案:

sed -r 's#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g' system_date.txt
awk -F "[/: ]" '{sub("Apr","04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}' system_date.txt 
awk 'BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}' system_date.txt

2.2 演示:

[root@show awkfile]# sed -r 's#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g' system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
[root@show awkfile]# awk -F "[/: ]" '{sub("Apr","04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}' system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
[root@show awkfile]# awk 'BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}' system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

2.3 详细说明:

2.3.1 方法一:sed替换
[root@show awkfile]# sed -r 's#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g' system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

这一个sed命令分为两个部分:

第一部分-把Apr替换为04
s#Apr#04#g
这一步完成后,文件的内容为17/04/2015:09:29:24 +0800
第二部分-进行匹配
s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g

图1-1 详细解析正则表达式匹到的内容

2.3.2 方法二:awk替换
[root@show awkfile]# awk -F "[/: ]" '{sub(/Apr/,"04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}' system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

第一个里程碑-指定分隔符
awk -F "[/: ]"表示以/(斜线)或:冒号或空格为分隔符(菜刀)

第一列($1) 第二列($2) 第三列($3) 第四列($4) 第五列($5) 第六列($6) 第七列($7/$NF)
17 Apr 2015 09 29 24 +0800

第二个里程碑-把Apr替换为04
sub(/Apr/,”04”)
这里使用gsub也可以。

第三个里程碑-显示出来并变化位置

[root@show awkfile]# awk -F "[/: ]" '{sub(/Apr/,"04");print $1,$2,$3,$4,$5,$6,$7}' system_date.txt 
17 04 2015 09 29 24 +0800
17 04 2015 09 30 26 +0800
17 04 2015 09 31 56 +0800
18 04 2015 09 34 12 +0800
18 04 2015 09 35 23 +0800
19 04 2015 09 23 34 +0800
19 04 2015 09 22 21 +0800
20 04 2015 09 45 22 +0800

上面的结果已经很接近我们想要的了。
接下来就是变化位置,得到我们想要的结果。

[root@show awkfile]# awk -F "[/: ]" '{sub(/Apr/,"04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}' system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
2.3.2 方法三:内置变量-技巧
[root@show awkfile]# awk 'BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}' system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

说明:
这个方法唯一要说明的就是FIELDWIDTHS这个内置变量,注意结尾有S哟。
示例1-1 举个例子

[root@show ~]# echo "20160121"
20160121

我想把20160121变为2016-01-21

[root@show ~]# echo "20160421"
20160421
[root@show ~]# echo "20160421"|awk 'BEGIN{FIELDWIDTHS="4 2 2"}{print $1"-"$2"-"$3}'
2016-04-21

FIELDWIDTHS这个内置变量可以规定,每一列的长度,每一列有多少个字符或文本。
内置变量的定义一般放在BEGIN模式里面。
FIELDWIDTHS=”4 2 2” 这个定义表示,在一行中,分为3列,第一列4个符号,第二列2个符号,第三列2个符号。
所以第一列的内容是2016,第二列的内容是04,第三列的内容是21.最后组合一下就是我们想要的结果。

[root@show awkfile]# awk 'BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}' system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

3.统计信息

今天是每日一题陪伴大家的第52天期待你的进步

对于题目和答案的任何疑问,请在博客评论区留言
往期题目索引

http://lidao.blog.51cto.com/3388056/1914205

【老鸟分享】Linux命令行终端提示符多种实用技巧!
https://mp.weixin.qq.com/s/g-bX6WVjJubv3ShY7jqs0Q


本文转自 李导 51CTO博客,原文链接:http://blog.51cto.com/lidao/1926769


相关文章
|
7月前
|
Java Android开发
技术经验解读:专属空间十一——私人影院(在线看电视台的直播)
技术经验解读:专属空间十一——私人影院(在线看电视台的直播)
85 0
《回归职业教育的本质 内容为王,质量至上,赢在口碑》电子版地址
回归职业教育的本质 内容为王,质量至上,赢在口碑
67 0
《回归职业教育的本质 内容为王,质量至上,赢在口碑》电子版地址
|
移动开发 安全 关系型数据库
黑客马拉松经验谈:一个周末你能做出有趣、有用的服务吗?
“黑客马拉松”(Hackathon),是黑客 + 马拉松(Hack + Marathon)的组合字,大致上就是几个人聚在一起以马拉松的方式进行一段长时间的 Hack 活动,像是台湾 Yahoo! 办过 Open Hack Day、台湾微软办过 HTML5 或 IE 浏览器的黑客松活动,这类型的活动,实际进行的时间从半天、一天到两天一夜的长度都有。
563 0
黑客马拉松经验谈:一个周末你能做出有趣、有用的服务吗?
宇宙有新惊喜了吗?十亿光年外存在巨大的反物质喷泉?
「反物质喷泉」本身就是备受争议的名词。
410 0
可怕的互联网,未来智能生命第一原型—CSDN2008英雄会技术讲座有感
Google专家谈云网计算,王小川谈搜狗输入法原理,句酷CEO张跃谈语句搜索无不彰显互联网的魔力和魅力。
440 0

热门文章

最新文章