使用shell在另一个匹配后提取匹配行

时间:2017-09-06 11:18:31

标签: shell csv pattern-matching

我环顾四周,但我无法找到答案。

我有一些这种形式的CSV文件:

* COMMENT
* Another comment 
100 ; 2029 ; 0.18 ; 0.45 ; 0.00015 ; 0.1485 ; 0.03 ; 1 ; 1 ; 2 ; 344 ; 100 ; 100 ; 

* Comment
* Comment

* ZT vector
0; 742; p; nan
1; 367; p; nan
2; 125; p; nan
3; 1; d; nan

* KS vector
0; 125; p; 33.3773
1; 742; p; 290.274
2; 1; d; 290.274
3; 367; p; 340.774



*Total time: 3.98785

我想提取包含模式d;的行,但只提取行* KS vector之后的行。

所以在这种情况下我想要一个像这样的输出:

2; 1; d; 290.274

不喜欢这样:

3; 1; d; nan
2; 1; d; 290.274

在每个CSV文件中,d;之后只有一行包含* KS vector* ZT vector* KS vector之间只有一行。

如何使用shell执行此操作?

1 个答案:

答案 0 :(得分:1)

使用awk:

$ awk '/KS vector/{f=1} f==1&&/d/' file
2; 1; d; 290.274

说明:

awk '                
/KS vector/ { f=1 }  # after this record flag up
f==1 && /d/          # if flag is up and we see d, output
' file