如何提取以下文本中包含 g__something 但后面不跟 s__something 的行?

如何提取以下文本中包含 g__something 但后面不跟 s__something 的行?

我想提取出那些包含g__somethingnot 的s__something行。我该怎么做?

这是我的文字

答案1

此 awk 命令将无条件打印前两行file,并打印包含g__except 的其他行,但后面跟s__

awk 'NR<3 || /g__/ && !/g__.*s__/' file

请注意,此解决方案将打印以下行:s__ 先于 g__。如果要排除包含 的行,s__无论它位于之前还是之后g__,请将第二个条件更改为!/s__/

答案2

这在 python3 中可以轻松完成。以下程序将打印包含“g__”但不包含“s__”的行。

将其粘贴到名为的文件中find_g.py,并将数据放入data.txt

import sys

# Open the file for reading
with open(sys.argv[1]) as f:

    # Print first two lines without any condition
    print(f.readline(), end='')
    print(f.readline(), end='')

    # Check for condition in rest of the file
    for line in f:
        if "g__" in line and "s__" not in line:
            print(line, end='')

然后,

python3 find_g.py data.txt

答案3

您的要求是:提取前两行,然后提取包含模式“g__”但不包含“s__”的行

一个简单的方法如下:

head -2 inputfile > outputfile; grep "g__" inputfile | grep -v "s__" >> outputfile

';' 之前的部分提取 inputfile 的前两行并将它们放入 outputfile 中。';' 之后的部分首先提取所有包含“g__”的行,然后从中删除具有模式“s__”的行。然后使用 >> 运算符将这些行附加到 outputfile 中,这样之前添加的行就不会被覆盖。

这是解决问题的一个非常简单的方法。当然,在性能方面还有其他解决方案(也许 awk 在处理大文件时效果更好),也许比这个更优雅。

相关内容