linux 需要awk帮助打印文件的一部分[已关闭]

1u4esq0p  于 2023-06-21  发布在  Linux
关注(0)|答案(3)|浏览(104)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

4天前关闭。
Improve this question
我正在寻找帮助使用awk打印只有一个文本文件的一部分,开始与一个关键字(TC024)和结束与一个空行,但然后也打印以下2行后的空行。我一直在尝试如下,但它不起作用:

awk '/TC024/{p=1} p; p && /^$/{c++} p && c<=2{print} c==3{exit}' test1.txt
0s0u357o

0s0u357o1#

打印以下两行
我建议使用getline,考虑下面的简单示例,让file.txt内容

DO NOT PRINT
TC024
PRINT THIS
PRINT THIS

PRINT ALSO THIS
PRINT ALSO THIS
DO NOT PRINT

然后

awk '/TC024/{p=1}p{print}/^$/{getline;print;getline;print;p=0}' file.txt

给出输出

TC024
PRINT THIS
PRINT THIS

PRINT ALSO THIS
PRINT ALSO THIS

说明:在遇到TC024后,将标志p设置为1print当前行如果p被设置为非零,当遇到空行print时,使用getlineprint的两个后续行然后将p设置为0

  • (在GNU Awk 5.1.0中测试)*
2wnc66cl

2wnc66cl2#

概念上本质上相同的方法,但是将所有模式动作块转换为单个range pattern
通过在range pattern本身中嵌入ON / OFF指示符标志的切换,* 除了我用来定义默认标志值 * 的***BEGIN { }***块,甚至可以完全不使用用户定义的动作块:

mawk 'BEGIN {   _ = __ = (_ = 3) ^ (_^_-- + (___ = _)) 
            } /TC024/ && (_ = __), (/./ ? _ : _ = ___ + NR) == NR'
TC024
foo
bar
baz

1st footer
2nd footer
TC024
lorem
ipsum

1st footer2
2nd footer2
kxkpmulp

kxkpmulp3#

请尝试以下操作:

awk '
    /TC024/ {p=1}               # set flag if the pattern matches
    p || c&&c-- {print}         # print if flag is set or c is positive
    p && /^$/ {p=0; c=2}        # reset flag and set counter c on the blank line
' test1.txt

或一行程序:

awk '/TC024/{p=1} p||c&&c--{print} p&&/^$/{p=0;c=2}' test1.txt

test1.txt示例:

TC024
foo
bar
baz

1st footer
2nd footer
3rd footer
TC024
lorem
ipsum

1st footer2
2nd footer2
3rd footer2

输出:

TC024
foo
bar
baz

1st footer
2nd footer
TC024
lorem
ipsum

1st footer2
2nd footer2

相关问题