![如何提取以下文本中包含 g__something 但后面不跟 s__something 的行?](https://linux22.com/image/928157/%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%96%E4%BB%A5%E4%B8%8B%E6%96%87%E6%9C%AC%E4%B8%AD%E5%8C%85%E5%90%AB%20g__something%20%E4%BD%86%E5%90%8E%E9%9D%A2%E4%B8%8D%E8%B7%9F%20s__something%20%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
我想提取出那些包含g__something
not 的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 在处理大文件时效果更好),也许比这个更优雅。