Как извлечь строки, содержащие в себе g__something, но не сопровождаемые s__something в следующем тексте?

. Я хочу извлечь те строки, которые содержат g__something , за которыми не следует s__something в строках. Как я могу это сделать?

Вот мой текст

-2
задан 1 August 2020 в 12:44

3 ответа

Ваши требования: извлеките первые две строки, а затем строки, содержащие шаблон «g__», но не «s __»

Один простой способ заключается в следующем:

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

Часть перед ';' извлеките первые две строки входного файла и поместите их в выходной файл. Часть после ';' сначала извлеките все строки, содержащие «g__», а затем удалите из них строки с шаблоном «s__». Затем эти строки добавляются с помощью оператора >> в выходной файл, чтобы строки, добавленные ранее, не перезаписывались.

Это очень простой подход к проблеме. Конечно, есть другие решения с точки зрения производительности (возможно, awk лучше работает в случае больших файлов) и, возможно, более элегантно, чем это.

0
ответ дан 2 August 2020 в 21:59

Это легко сделать в 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
1
ответ дан 2 August 2020 в 21:59

Эта команда awk безоговорочно распечатает первые две строки файла и напечатает другие строки, содержащие g __ , за исключением случаев, когда за ним следует s __

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

Обратите внимание, что это решение будет печатать строки, где s __ предшествует g __ . Если вы хотите исключить строки, содержащие s __ , независимо от того, идет ли он до или после g __ , измените второе условие на ! / S __ /

2
ответ дан 2 August 2020 в 21:59

Другие вопросы по тегам:

Похожие вопросы: