【问题标题】:Print lines between two patterns along with the header打印两个图案之间的线条以及标题
【发布时间】:2020-05-05 21:57:20
【问题描述】:

我有如下文件:

Name: DB1
========================================================
Primary :
f3
f6
f7
f9
f0
Secondary :
internal input
internal output
internal Loaded
internal output
internal Loaded

Name: DB2
========================================================
Primary :
s2
m5
m7
m8
m9 
Secondary :
External output
External Revoke
External Reuse
External input

但我需要这样的输出,需要提取 Primary 和 Secondary 之间的行以及名称:

Name: DB1
========================================================
f3
f6
f7
f9
f0

Name: DB2
========================================================
Primary :
s2
m5
m7
m8

我试过这个:

$ awk '/Primary :/{flag=1; next} /Undriven :/{flag=0} flag' file
f3
f6
f7
f9
f0
s2
m5
m7
m8
m9

我没有得到任何人的名字,请帮助我。

【问题讨论】:

  • 字符串Undriven : 没有出现在您的输入中,因此这对您来说可能是个问题。我假设预期输出中缺少第一个 Primarym9 是一个错误。如果是,请修复它,如果不是,请解释省略它们的标准。

标签: awk sed


【解决方案1】:

看起来您非常接近,除了 (a) 您从未明确匹配 Name: 行,并且 (b) 您匹配的单词“Undriven”未出现在您的示例中数据。

我可能会这样做:

awk '
/^Name:/
/^====/
/^Primary :/{flag=1; next}
/^Secondary :/{flag=0}
flag
' file

作为输出产生:

Name: DB1
========================================================
f3
f6
f7
f9
f0
Name: DB2
========================================================
s2
m5
m7
m8
m9

【讨论】:

  • 命名标志变量 flag 就像命名数字变量 number 而不是 countsumtotalaverage 或任何它所代表的 - 这是一个错失的机会提供有关代码功能的一些有用信息。在这种情况下,found(通常缩写为 f)是您在输入中找到某些内容时设置的标志变量的通用名称。如果您只是交换设置/清除标志的 2 个比较的顺序并将导致打印的测试放在它们之间(/Sec/{f=0} f; /Prim/{f=1}),那么您不需要next
  • 我大体上同意,虽然我对这件事的看法不如你那么强烈。一般来说,我的政策是尽可能多地重用 OP 的代码。
【解决方案2】:

如果这不是您所需要的全部,请编辑您的问题,以提供更真正具有代表性的示例输入/输出,这不适用于:

$ awk -v RS= -F'\n' '{for (i=1;i<=8;i++) print $i; print ""}' file
Name: DB1
========================================================
Primary :
f3
f6
f7
f9
f0

Name: DB2
========================================================
Primary :
s2
m5
m7
m8
m9

或:

$ awk -v RS= -v FS='\n' '{print $1 ORS $2; for (i=4;i<=8;i++) print $i; print ""}' file
Name: DB1
========================================================
f3
f6
f7
f9
f0

Name: DB2
========================================================
s2
m5
m7
m8
m9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多