我有一个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>
在这里,来自上面的文件
Animal: type=Reptile
到pattern2 Animal Color:
的行目前我使用的是以下内容:
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
如何实现?
答案 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
适合的按摩。