linux - 如何在打印前grep多个字符串并格式化
问题描述
我有一个txt文件如下:
cat file.txt
<Some text here>
<Some text here>
Animal: type=Reptile age=17 s=M val=snake
Animal Code: 123
Animal Color: Black
Animal: type=Reptile age=20 s=M val=Lizard
Animal Code: 200
Animal Color: light_Brown
<Some text here>
<Some text here>
在这里,从上面的文件
- 我想提取匹配 pattern1
Animal: type=Reptile
到 pattern2的行Animal Color:
- 在提取的行中,我想搜索“代码”、“val”和“颜色”
目前我使用的内容如下:
awk '/Animal.*Reptile/,/Animal Color:/' file.txt | grep "Animal Code:\|val\|Animal Color:" | awk '{ if ($5 != NULL ) print $5 ; else print $3; }' | tr "=" "\n" | grep -v val
输出如下:
snake
123
Black
Lizard
200
light_Brown
我希望输出格式为Code,val,Color如下所示:
123,snake,Black
200,Lizard,light_Brown
如何做到这一点?
解决方案
awk 和 grep 在处理多行时不是很强大——它们都最擅长一次处理一行。awk 可以记住一行中的某些内容并在另一行中使用它,因此在您的特定情况下,单独 awk 可以完成这项工作,但需要一些工作。
我假设行的顺序是固定的,因此对于同一动物,您不会在“动物代码”之前获得“动物颜色”行。另外,val=? 被认为是“动物:”行中的最后一件事。
这个怎么样:
awk_prog='
/^Animal: type=Reptile/ { sub(".*val=",""); val=$0 }
/Animal Code: / { code=$NF }
/Animal Color: / { color=$NF ; print code "," val "," color }
'
awk "$awk_prog" file.txt
为了清楚起见,程序被分成多行,当然你可以把它全部放在一行上。
推荐阅读
- python - networkx 按属性搜索节点
- bash - 使用 sed 进行 Unix 搜索和替换
- django - Bootstrap datetimepicker $(...).datetimepicker 不是一个函数,即使在将脚本按正确顺序放置之后
- typescript - 扩展对护照用户参数的快速请求
- android - 搜索时隐藏特定的列表视图项(过滤器)
- css - font-awesome icon - onmouseover 事件改变颜色
- android - 即使添加了存储库也无法解析 NavigationView
- sql - Sql Query 接收名称而不是 ID
- c - 从其他 C 程序观察运行程序的活动。[报告击键]
- ruby - 使用 stomp (ruby) 到 ActiveMQ 将消息属性设置为整数