专栏首页程序手艺人[ Shell篇 ] - AWK征服数据处理

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

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

  1. 配置功放芯片TAS5754的EQ,软件导出来的格式如下:
#			--------------------------------------------------------------- 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和> 都是想要数据,有了这个规律就好办了, 最终完成之后的数据如下:
// 只提取了所有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和>开头的所有数据
$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列

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

完成之后的数据变为:

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列
$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中文版本

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值

    实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这...

    程序手艺人
  • Git Merge

    程序手艺人
  • C++之函数参数的扩展

    程序手艺人
  • 大数据表查询优化 - 表分区

    快两年没写过业务代码了…… 今天帮一个研发团队优化了一下数据库表的查询性能。使用的是表分区。 简单记录了一下步骤,方便直接用:

    用户1172223
  • Python分析《我不是药神》豆瓣评论

    看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任务(其实都是一些很简单的任务,纯练手用),后续会持续更新...

    猫咪编程
  • [Oracle]-[索引][HINT][执行计划]-带HINT的索引执行计划

    谭老师的《Oracle 10g 性能分析与优化思路》第六章hint部分介绍: 举例: create table t(id int); create inde...

    bisal
  • Hive中分区和分桶的概念和操作

    在使用传统的RDBMS数据库(关系数据库),例如MySql时,对于一些大表,我们通常会进行分表操作,以提升查询效率。在Hive中也提供了类似的概念和操作,本文将...

    张子阳
  • 自制一个 LoRa PM2.5 监测器

    年前整理医院发票,发现小孩一整年看病花了快3000块,幸好买的保险能报销大部分。病历基本都是支气管炎、上呼吸道感染、咽炎,还有一次发展成了肺炎去拍了胸片。小孩这...

    twowinter
  • java 获取一天内crontab任务执行的时间点

    但是,貌似这个方法已经过时无法使用了。 可以通过下面的方法,获取当天一整天内任务执行的时间点。

    我是李超人
  • 程序员该如何安排工作时间

    这周又是早九点,晚八点。上周上上周....... 早九晚八,累的跟狗似的。 不禁要唱唱时间都去哪了,还没好好感受年轻就老了 一、停下脚步 ? 让我们停下来审视一...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券