Awk 如何在第三行之后打印文本?

Awk 如何在第三行之后打印文本?,awk,Awk,我有一个输入-有三次同一行的东西和同一行 o 0 1 0 1 1 5.732820000 0.000 = PERIOD(0) 5456 text4 o 2 11 0 1 1 0.000000000 0.100 = d q/dt o 0 1 0 1 1 5.732820000 0.000 = PERIOD(0) 454 785 text7 o 2 11 0 1 1 0.000000000 0.100 = d q/dt o

我有一个输入-有三次同一行的东西和同一行

o 0  1 0 1 1      5.732820000     0.000 = PERIOD(0)
5456
text4
o 2 11 0 1 1      0.000000000     0.100 = d q/dt
o 0  1 0 1 1      5.732820000     0.000 = PERIOD(0)
454
785 text7
o 2 11 0 1 1      0.000000000     0.100 = d q/dt
o 0  1 0 1 1      5.732820000     0.000 = PERIOD(0)
4
text78
o 2 11 0 1 1      0.000000000     0.100 = d q/dt
我想在第三个“同一行”和第三个“同一行结束”之间打印文本。请问怎么做

所需输出:

4
text78
解释

  • c
  • ^同一行$
    ^结束同一行$
  • 如果
    c==3
    f==1
表达式顺序控制输出中是否包括开始标记或结束标记(
同一行

解释

  • c
  • ^同一行$
    ^结束同一行$
  • 如果
    c==3
    f==1

表达式顺序控制输出中是否包括开始标记或结束标记(
同一行)。

对于特定的文件数据格式:

awk '/^same line/ && ++cnt == 3{ found=1; next }found && /^end same line/{ exit }found' file
  • 找到&&/^end-same-line/{exit}
    -将在特定节上退出,以防止冗余处理(根据“第三个“同一行”和第三个“end-same-line”之间的定义)
输出:

4
text78

对于您的特定文件数据格式:

awk '/^same line/ && ++cnt == 3{ found=1; next }found && /^end same line/{ exit }found' file
  • 找到&&/^end-same-line/{exit}
    -将在特定节上退出,以防止冗余处理(根据“第三个“同一行”和第三个“end-same-line”之间的定义)
输出:

4
text78

非常感谢,请问这个错误是什么意思?我替换了start和end
awk:cmd的文本。行:1://^o21101000000000.100=dq/dt$/{f=0}c==3&&f==1/^o 0 1 0 1 1 5.7328200000.000=期间(0)$/{c++;f=1}awk:cmd。第1行:^语法错误awk:cmd。行:1://^o21101000000000.100=dq/dt$/{f=0}c==3&&f==1/^o 0 1 0 1 1 5.7328200000.000=期间(0)$/{c++;f=1}awk:cmd。行:1:
@MarciaCross您的搜索字符串包含一个
/
。您需要转义它,因为它是正则表达式模式分隔符。此外,如果搜索字符串中有更多特殊字符,则还需要对其进行转义。所以
^
$
之间的字符串应该是
o211010000000000 0.100=dq\/dt
。谢谢。我不知道为什么我添加到问题中的输入不起作用。没有错误,但输出文件是空的。@MarciaCross有两个原因:(1)在
0.000000000
之前和之后有多个空格(或表格),因此应该用
\s+
替换单个空格;(2)模式中没有3或4个段落,只有两个。另外,您没有问正确的问题,因为您的结束模式与开始模式相同(这与您原来的问题不同)。@MarciaCross
\s+
表示空白(至少一个)。如果开始搜索字符串和结束搜索字符串相同,则更容易,因为您将只计算匹配项并在匹配项计数等于3(或在您的示例中为2)时打印。非常感谢,请问这个错误是什么意思?我替换了start和end
awk:cmd的文本。行:1://^o21101000000000.100=dq/dt$/{f=0}c==3&&f==1/^o 0 1 0 1 1 5.7328200000.000=期间(0)$/{c++;f=1}awk:cmd。第1行:^语法错误awk:cmd。行:1://^o21101000000000.100=dq/dt$/{f=0}c==3&&f==1/^o 0 1 0 1 1 5.7328200000.000=期间(0)$/{c++;f=1}awk:cmd。行:1:
@MarciaCross您的搜索字符串包含一个
/
。您需要转义它,因为它是正则表达式模式分隔符。此外,如果搜索字符串中有更多特殊字符,则还需要对其进行转义。所以
^
$
之间的字符串应该是
o211010000000000 0.100=dq\/dt
。谢谢。我不知道为什么我添加到问题中的输入不起作用。没有错误,但输出文件是空的。@MarciaCross有两个原因:(1)在
0.000000000
之前和之后有多个空格(或表格),因此应该用
\s+
替换单个空格;(2)模式中没有3或4个段落,只有两个。另外,您没有问正确的问题,因为您的结束模式与开始模式相同(这与您原来的问题不同)。@MarciaCross
\s+
表示空白(至少一个)。如果开始搜索字符串和结束搜索字符串相同,则更容易,因为您只需在匹配计数等于3(或示例中为2)时计算匹配数并打印。