如何在打印前grep多个字符串并设置其格式

时间:2018-06-26 12:24:24

标签: linux awk 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. 我想提取匹配pattern1 Animal: 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

我希望将输出格式化为如下所示的代码,值,颜色

123,snake,Black
200,Lizard,light_Brown

如何实现?

2 个答案:

答案 0 :(得分:1)

当涉及到多行时,

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

为清楚起见,该程序分为多行,您当然可以将其全部放在一行上。

答案 1 :(得分:0)

这将使您可以按照自己喜欢的顺序按自己的名字打印任意字段:

$ cat tst.awk
BEGIN { FS="[: =]+"; OFS="," }
/Animal/ {
    sub(/^ +/,"")
    for (i=2; i<NF; i+=2) {
        f[$i] = $(i+1)
    }
    if (/Color/) {
        print f["Code"], f["val"], f["Color"], f["age"], f["s"], f["type"]
        delete f
    }
}

$ awk -f tst.awk file
123,snake,Black,17,M,Reptile
200,Lizard,light_Brown,20,M,Reptile

适合的按摩。