【问题标题】:find some text aa and then find first appearance of text bb after aa找到一些文字 aa,然后在 aa 之后找到文字 bb 的第一次出现
【发布时间】:2013-04-23 05:22:41
【问题描述】:

整个文本文件如下:

aa
...
bb
...
bb
...
aa
...
bb
...

aa 行之后会有一行或多行bb

我尝试了下面的命令,它可以很好地处理所有行 aa 和上面的行 aa

grep -A 1 aa fileName

如何打印所有行 aa 和上面的行 aa 以及第一行 bb 之后的行 aa 和上面的行 bb 行?

已编辑:需要为每次出现aa 查找第一行(并且仅是第一行)bb,同时打印行号。也许我重新表述这个问题:对于每一行aa,在aa之后找到第一行bb,然后打印出aabb和它们上面的行,行号为好吧。

考虑下面的输入文件,第一列是行号,它不是输入文件的一部分

1 xxx
2 aa
3 xxxx
4 bb
5 bb
6 xxxx
7 aa
8 xxxx
9 xxxx
10 xxxx
11 bb
12 xxx
13 aa
14 xxx
15 bb

我想要输出:

1 xxx
2 aa
3 xxxx
4 bb
6 xxxx
7 aa
10 xxxx
11 bb
12 xxx
13 aa
14 xxx
15 bb

【问题讨论】:

    标签: linux sed awk grep


    【解决方案1】:

    这样就可以了:

    awk '/aa/{f=1}/aa|bb/&&f{printf "%d %s\n%d %s\n",NR-1,a,NR,$0}{a=$0}/bb/{f=0}' 
    

    【讨论】:

    • 谢谢!不知何故,第一个对我不起作用,我可以使用 grep 处理它。第二个只显示第一次出现,它怎么能显示所有这些出现?并输出行号?
    • 如果你可以用grep处理第一个问题,那么为什么要问这个问题,至于第二个,是的,它在第一个匹配后退出,因为这是你要求的,打印行号是简单的。我已经进行了修改。
    • 我编辑了问题再次澄清了问题。对于aa 的每一行,在此aa 之后找到bb 的第一行且唯一的第一行。两个aa 之间可能有多个bb 行(至少一个),我只需要找到第一行。
    【解决方案2】:

    命令

    grep -C 1 aa fileName
    

    将打印所有带有 aa 的行以及之前和之后的行

    【讨论】:

    • 谢谢。我知道 grep 的 -A、-B 和 -C 选项,但这并不能回答我的问题(在 aa 之后找到第一次出现的 bb)。
    猜你喜欢
    • 2020-09-19
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2021-03-22
    • 2020-02-13
    相关资源
    最近更新 更多