首页 > 解决方案 > 如何在打印前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>

在这里,从上面的文件

  1. 我想提取匹配 pattern1Animal: type=Reptile到 pattern2的行Animal Color:
  2. 在提取的行中,我想搜索“代码”、“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

如何做到这一点?

标签: linuxawkgrep

解决方案


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

为了清楚起见,程序被分成多行,当然你可以把它全部放在一行上。


推荐阅读