Когда вы начнете использовать комбинации grep
, sed
, awk
, cut
и т. Д., Вы должны понимать, что все это можно сделать одной командой awk. В случае OP это будет происходить точно так же:
awk '/[&]END COORD/{p=0}
p { print $2,$3,$4 }
/[&]COORD/{p=1}' file
Это анализирует файл, отслеживающий флаг печати p
. Флаг устанавливается, если "& COORD" найден, и не установлен, если "& END COORD" найден. Печать выполняется только при установленном флаге p
. Так как мы не хотим печатать строку с «& END COORD», мы должны сбросить флаг, прежде чем мы сделаем проверку на печать. То же самое относится и к строке с «& COORD», но там мы должны сбросить ее после того, как выполним проверку печати (это немного странная обратная логика c).
Проблема с вышеупомянутым является то, что он также будет обрабатывать строки
UNIT angstrom
Если вы хотите удалить их, вы можете проверить общие столбцы:
awk '/[&]END COORD/{p=0}
p && (NF==4){ print $2,$3,$4 }
/[&]COORD/{p=1}' file
Из печати только строки, которые не содержат «UNIT» или являются пустыми:
awk '/[&]END COORD/{p=0}
p && (NF>0) && ($1 != "UNIT"){ print $2,$3,$4 }
/[&]COORD/{p=1}' file