前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ Shell篇 ] - AWK征服数据处理

[ Shell篇 ] - AWK征服数据处理

作者头像
程序手艺人
发布2019-02-21 16:52:43
6010
发布2019-02-21 16:52:43
举报
文章被收录于专栏:程序手艺人程序手艺人

实际过程中一些从软件导出来的配置文件格式格式比较混乱,一般需要整理成特定的格式,才好处理,场景如下:

  1. 配置功放芯片TAS5754的EQ,软件导出来的格式如下:
代码语言:javascript
复制
#			--------------------------------------------------------------- page 0 is selected
w 98 00 00
#			--------------------------------------------------------------- page 1 is selected
w 98 00 01
#			# reg[1][3] = 0x4
w 98 03 04
#			--------------------------------------------------------------- page 0 is selected
w 98 00 00
#			# reg[0][0x3] = 0x11
w 98 03 11
#			# reg[0][2] = 0x10
w 98 02 10
#			--------------------------------------------------------------- page 44 is selected
w 98 00 2c
#			 (Bit 31-24) ------------ MSB DAC COEFF No. 0
w 98 08 ff
#			 (Bit 23-16)
> ff
#			 (Bit 15-8)
> ff
#			 (Bit 7-0)
> 00
#			 (Bit 31-24) ------------ MSB DAC COEFF No. 1
> 80
#			 (Bit 23-16)
> 00
#			 (Bit 15-8)
> 00
#			 (Bit 7-0)
> 00
#			 (Bit 31-24) ------------ MSB DAC COEFF No. 2
> 40
#			 (Bit 23-16)
> 00
#			 (Bit 15-8)
> 00
#			 (Bit 7-0)
> 00
#			 (Bit 31-24) ------------ MSB DAC COEFF No. 3
> 7f
#			 (Bit 23-16)
> ff
#			 (Bit 15-8)
> ff
#			 (Bit 7-0)
> 00
....

总共有7642行
  1. 这种格式文件一般需要写一个脚本去过滤掉无用的数据,可以发现这个文件有需要的数据有一些规律:w和> 都是想要数据,有了这个规律就好办了, 最终完成之后的数据如下:
代码语言:javascript
复制
// 只提取了所有w开头的第2行和第3行数据和> 开头的第1行数据
00 00
00 01
03 04
00 00
03 11
02 10
00 2c
08 ff
ff
ff
00
80
00
00
00
40
00
00
00
7f
ff
实现步骤

一看这个文件基本都是列的操作,所以使用awk这个强大的工具过滤掉无用的数据。这个命令很久没有了,重点可以参考AWK 简明教程三十分钟学会AWK快速了解该命令的用法,这里不介绍基本语法。

提取w和>开头的所有数据
代码语言:javascript
复制
$FILE=源文件
$PROCESS=处理之后的数据


#匹配第一行如果是w,则打印$2,$3,$4,如果第一行是>,则打印$2

awk '{if($1 ~/w/) print $2,$3,$4; else if($1 ~/>/) print $2}' $FILE > $PROCESS

这里使用了if和else语句,如果$1(第1列)和w匹配,则打印 第2,3,4列

如果$1和>匹配,则只打印第2列

其中 ~ 表示模式开始。/ /中是模式。这就是一个正则表达式的匹配。

完成之后的数据变为:

代码语言:javascript
复制
98 00 00
98 00 01
98 03 04
98 00 00
98 03 11
98 02 10
98 00 2c
98 08 ff
ff
ff
00
80
00
00
00
提取以98开头的第2列和第3列
代码语言:javascript
复制
$PROCESS=只有w和>开头的数据

# 如果第一行是98,则打印第2.3行,否则打印第一行

awk '{if($1 ~ /98/) print $2,$3; else print $1}' $PROCESS > $FINISH_HEX

最终通过awk完成了数据的过滤.


文章参考
  1. awk分隔符
  2. 如何使用 awk 和正则表达式过滤文本或文件中的字符串
书籍推荐

豆瓣评分9.6分

  1. The AWK Programming Language

原版英文书,国人译成中文版本AWK中文版本

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现步骤
  • 提取w和>开头的所有数据
  • 提取以98开头的第2列和第3列
  • 文章参考
  • 书籍推荐
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档