【问题标题】:How to use awk to print a particular section of input file如何使用awk打印一个特定的输入文件部分
【发布时间】:2015-10-02 21:59:00
【问题描述】:

我有一个这样的输入文件。

#
#mdrun is part of G R O M A C S:
#
#Go Rough, Oppose Many Angry Chinese Serial killers
#
@    title "dH/d\xl\f{}, \xD\f{}H"
@    xaxis  label "Time (ps)"
@ s0 legend "dH/d\xl\f{} \xl\f{} 0.1"
@ s1 legend "\xD\f{}H \xl\f{} 0.05"
@ s2 legend "\xD\f{}H \xl\f{} 0.15"
0.0000 -33.8598 1.71168 -1.66746
0.2000 -34.3949 1.73192 -1.702
0.4000 -31.8213 1.61262 -1.56193
0.6000 -32.3563 1.63639 -1.59224
0.8000 -33.6158 1.69898 -1.65539
1.0000 -32.5242 1.65055 -1.59363
1.2000 -33.7464 1.70708 -1.6607
1.4000 -33.0552 1.68563 -1.60985
1.6000 -32.9946 1.66834 -1.62445
1.8000 -31.6345 1.60933 -1.54529
2.0000 -33.1246 1.67736 -1.62769
2.2000 -33.9822 1.71743 -1.67394
2.4000 -32.4887 1.64732 -1.59384
2.6000 -30.0927 1.5349 -1.46508 
so on till 100000.0000

我想生成一个包含特定部分(完整行)的新文件,例如 1000.0000-2000.0000,所有行都包含“@”和“#”。有人建议我使用 awk 并建议使用此代码。

  awk '(/^1000/,/^2000/) || /^[@#]/{print;}' inputfile > outputfile

显示错误。

  awk: line 1: syntax error at or near ||

我之前没有使用过 awk,所以我不知道如何在 awk 中编写代码。如果有人可以建议如何在 awk 或任何其他类似 sed 的代码中编写正确的代码。我会很感激。

【问题讨论】:

    标签: file awk


    【解决方案1】:

    您不能以这种方式将范围运算符,|| 组合在一起,尽管在这种情况下还有另一种选择:

    awk '/^1000/,/^2000/; /^[@#]/' inputfile > outputfile
    

    分号分隔两个条件。对于每个为真的条件,都会执行默认操作(打印行)。如果您的条件发生冲突(您的输出中会出现重复的行),这将是一个问题,但这不适用于此处。

    更一般地说,您可以使用变量来确定要打印的行:

    awk '/^1000/{f=1} f||/^[@#]/; /^2000/{f=0}' inputfile > outputfile
    

    这处理两个单独的条件可能同时为真的情况。

    【讨论】:

    • 很好,为我工作!
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多