Следующий сценарий Awk должен печатать все строки из входного файла, за исключением строк, которые начинаются с «HETATM» и содержат где-то в той же строке шаблоны «lig» или «lih», а также все строки, начинающиеся с « КОНЕЦ". Наконец, он должен добавить «END» в конец отфильтрованного файла:
awk '!/^HETATM/ && /lig|lih |^END/; END {print "END"}' test.pdb >> ./processed.pdb
но на самом деле он удаляет почти все строки, создавая пустой файл с END
в конце, таким образом фильтруя все строки. Возможное решение:
awk '!/^HETATM.*(lig|lih)/ && !/^END/; END {print "END"}'
Будет ли он работать корректно?
!(/^HETATM/ && /lig|lih |^END/) почти работает. параллельно следует удалить все строки, начинающиеся с END, и добавить в конец файла END !
например awk '!/^HETATM.*(lig|lih)/ это работает, но если я хочу дополнительно удалить все END в начале, это не сработает awk '!/^HETATM.*(lig|lih)/ |^END /
пожалуйста, обновите вопрос, указав некоторые примеры данных (4-6 строк, некоторые с совпадениями, некоторые без совпадений), (неправильный) вывод, сгенерированный вашим кодом, и (правильный) ожидаемый результат.
Ну наконец-то я это понял: awk '!/^HETATM.*(lig|lih)/ && !/^END/; КОНЕЦ {напечатать "КОНЕЦ"}'
следует добавить «END» в конец отфильтрованного файла
Имейте в виду, что в GNU AWK
END
срабатывает после обработки всех файлов, в отличие от ENDFILE, в простом примере пусть содержимое file1.txt
, file2.txt
и file3.txt
будет соответственно 1
, 2
, 3
, тогда
awk '{print}ENDFILE{print "endfile"}END{print "end"}' file1.txt file2.txt file3.txt
дает результат
1
endfile
2
endfile
3
endfile
end
Вы можете сразу проигнорировать эту деталь, если у вас есть гарантия, что в вашу команду awk всегда будет вставлен ровно один файл.
(проверено в GNU Awk 5.1.0)
некоторые примеры ввода/вывода могли бы помочь.. также, возможно, вы хотели использовать
!(/^HETATM/ && /lig|lih |^END/)
или, возможно,!/^HETATM.*(lig|lih)/