我想提取出那些包含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 在处理大文件时效果更好),也许比这个更优雅。