【问题标题】:printing lines with more than three fields and the line above打印多于三个字段的行和上面的行
【发布时间】:2014-11-05 17:36:35
【问题描述】:

我有一个文件如下:

scaf_1245 457 1
457
scaf_457 784 5
457 4578 784 487 4578
scaf_847 487 4
457 487 487

如何使用 awk 和 grep 打印包含三个以上字段的行(仅包含数字的行)及其上方的行?

我知道:

awk 'NF>3' file 

grep -B 1 pattern

Desired output:

scaf_457 784 5
457 4578 784 487 4578

但不知道如何组合这些。

【问题讨论】:

    标签: awk grep


    【解决方案1】:

    grep去做吧:

    grep -B1 ".* .* .* .*" file
    

    这会查找至少有四个文本块的行。然后,-B1 打印匹配和 1 行 Before 匹配的行。

    awk 你可以说:

    awk 'NF>3 {print f; print} {f=$0}' file
    

    它将当前行存储在变量ff=$0 中。然后,当NF>3 匹配时(即一行中超过 3 个字段),它会将存储的行与当前行一起打印。这可能会出现打印重复行的问题。

    对于给定的文件,它返回:

    scaf_457 784 5
    457 4578 784 487 4578
    

    来自man grep

    -B NUM, --before-context=NUM

    在匹配行之前打印 NUM 行前导上下文。放置一个 包含组分隔符的行(如下所述 --group-separator)在连续的匹配组之间。使用 -o 或 --only-matching 选项,这不起作用并给出警告。

    【讨论】:

    • 你可以用 awk 做的事情太酷了,但是当涉及到这些类型的代码时,我真的无法编写它们。对于如何将 awk 学习到这样的程度有什么建议吗?还是只能通过实践来获得?
    • 我真的很喜欢这个教程:Idiomatic awk。除此之外,它就像所有的语言一样:你通过练习来学习它,当然还有阅读好的代码。在Stack Overflow 的 [awk] 标签中出现一段时间,您肯定会学到很多东西,我们都这样做!
    • 作为旁注和题外话,您已经获得了投票的特权。随意做,正如我在您的个人资料中看到的那样,您从未做过! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多