. Я хочу извлечь те строки, которые содержат g__something
, за которыми не следует s__something
в строках. Как я могу это сделать?
Ваши требования: извлеките первые две строки, а затем строки, содержащие шаблон «g__», но не «s __»
Один простой способ заключается в следующем:
head -2 inputfile > outputfile; grep "g__" inputfile | grep -v "s__" >> outputfile
Часть перед ';' извлеките первые две строки входного файла и поместите их в выходной файл. Часть после ';' сначала извлеките все строки, содержащие «g__», а затем удалите из них строки с шаблоном «s__». Затем эти строки добавляются с помощью оператора >> в выходной файл, чтобы строки, добавленные ранее, не перезаписывались.
Это очень простой подход к проблеме. Конечно, есть другие решения с точки зрения производительности (возможно, awk лучше работает в случае больших файлов) и, возможно, более элегантно, чем это.
Это легко сделать в 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
Эта команда awk безоговорочно распечатает первые две строки файла
и напечатает другие строки, содержащие g __
, за исключением случаев, когда за ним следует s __
awk 'NR<3 || /g__/ && !/g__.*s__/' file
Обратите внимание, что это решение будет печатать строки, где s __
предшествует g __
. Если вы хотите исключить строки, содержащие s __
, независимо от того, идет ли он до или после g __
, измените второе условие на ! / S __ /