@sed/awk脚本数据处理一则
需求
某日一同事问我能否从一个串口数据里提取固定位置的几个数据
就像下面所示,提取9,10位的数据并转换位10进制值:
AA 55 00 9F AC 01 00 00 25 8C 00 9B AA 55 00 9F AC 01 00 00 25 65 00 72 AA 55 00 9F AC 01 00 00 25 7F 00 68 AA 55 00 9F AC 01 00 00 25 A0 00 B7 AA 55 00 9F AC 01 00 00 25 75 00 62 AA 55 00 9F AC 01 00 00…
这个很容易想到用sed/awk命令实现,可以在windows下cygwin执行:
为了便于理解,分解成以下几个步骤:
- cd d:/
(进入d分区, 要转换的原始文件(假定位1.txt)放在该目录下;或者cd 到待处理文件所在目录)‘ cygwin环境) - sed ‘s/AA 55/\nAA 55/g’ 1.txt > 2.txt
(以AA 55开头分行,分行后文件名2.txt; 该命令吧原始数据分行) - cat 2.txt | grep “AA 55” |tee 3.txt
去掉非完整数据帧 - awk ‘{print “0x”$7 $8" 0x" $9 $10}’ 3.txt |tee 4.txt
7/8位和9/10字段生成单独的列 (16进制) - awk -n ‘{print $1+0 " " $2+0 }’ 4.txt >5.txt
16进制转10进制
综上所述,可以通过管道把上述步骤合并位一条命令:
sed ‘s/AA 55/\nAA 55/g’ 1.txt | cat - |grep “AA 55” | awk ‘{print “0x”$7 $8" 0x" $9 $10}’ - | awk -n ‘{print $1+0 " " $2+0 }’ -
还有一个更好的方式是利用开源项目 SerialChart.
link