找到匹配,打印第一次出现并继续,直到文件结束 - awk

时间:2016-02-24 13:29:34

标签: awk

我有一个非常大的文件,我只希望从中提取包含我的匹配的第一行,然后继续这样做,直到文件结束。

下的输入和所需输出示例

输入

C,4,2,5,6,8,9,5
C,4,5,4,5,4,43,6
S,4,23,567,2,4,5
S,23,4,7,78,8,9,6
S,3,5,67,8,54,56
S,4,8,9,54,3,4,52
E,2,3,213,5,8,44
E,5,7,9,67,89,33
E,54,526,54,43,53
S,9,8,9,7,9,32,4
S,5,6,4,5,67,87,88
S,4,23,5,8,5,7,3
E,4,6,4,8,9,32,23
E,43,7,1,78,9,8,65

输出

S,4,23,567,2,4,5
S,9,8,9,7,9,32,4

我的行中的匹配是S,它通常出现在以E或C开头的行之后。我挣扎的是告诉awk只打印E或C之后的第一行。另一种方法是打印包含S的第一行。任何想法??

5 个答案:

答案 0 :(得分:4)

这个单行帮助吗?

awk '/^S/&&!i{print;i=!i}!/^S/{i=!i}' file

或更“可读”:

awk -v p=1 '/^S/&&p{print;p=0}!/^S/{p=1}' file

答案 1 :(得分:1)

您可以使用sed,如下所示:

sed -rn '/^(E|C)/{:a;n;/^S/!ba;p}' file

答案 2 :(得分:1)

这是一个输入文件的多线程(例如u.awk)

Select a.wono,date_format(b.wodt,'%Y/%m/%d') as mydate from wodtl_box a, wohdr_box b where a.wono=b.wono order by date_format(b.wodt,'%Y/%m/%d') DESC 

然后运行:“awk -f u.awk inputdatafile”

答案 3 :(得分:1)

awk救援!

$ awk '/^[CE]/{p=1} /^S/&&p{p=0;print}' file

S,4,23,567,2,4,5
S,9,8,9,7,9,32,4

答案 4 :(得分:0)

$ awk '/^S/{if (!f) print; f=1; next} {print; f=0}' file 
C,4,2,5,6,8,9,5
C,4,5,4,5,4,43,6
S,4,23,567,2,4,5
E,2,3,213,5,8,44
E,5,7,9,67,89,33
E,54,526,54,43,53
S,9,8,9,7,9,32,4
E,4,6,4,8,9,32,23
E,43,7,1,78,9,8,65