удалить строки между строками в файле - PullRequest
2 голосов
/ 19 октября 2011

У меня есть файлы, которые выглядят так:

ATOM 2517 O   VAL 160 8.337  12.679  -2.487
ATOM 2518 OXT VAL 160 7.646  12.461  -0.386
TER 
ATOM 2519 N   VAL 161 -14.431  5.789 -25.371
ATOM 2520 H1  VAL 161 -15.336  5.698 -25.811
ATOM 2521 H2  VAL 161 -13.416 10.529  17.708
ATOM 2522 H3  VAL 161 -14.363  9.436  18.498
ATOM 2523 CA  VAL 161   4.400  9.233  16.454
ATOM 2524 HA  VAL 161   3.390  9.170  16.047

Я должен удалить "TER", строку перед "TER" и 3 строки после строки сразу после TER и сделать файл непрерывным, как это:

ATOM 2517 O   VAL 160   8.337 12.679  -2.487
ATOM 2519 N   VAL 161 -14.431  5.789 -25.371
ATOM 2523 CA  VAL 161   4.400  9.233  16.454
ATOM 2524 HA  VAL 161   3.390  9.170  16.047

Ответы [ 4 ]

2 голосов
/ 19 октября 2011

Просто удалите строку, начинающуюся с TER.

   sed -i.bak '/^\s*TER\s*$/d' transrotate/myfiles

Если вы просто хотите удалить пустую строку, попробуйте это:

sed -i.bak '/^\s*$/d' transrotate/myfiles
1 голос
/ 19 октября 2011
sed '/^TER/d' yourFile  

выполнит работу

kent$  echo "ATOM 2517 O   VAL 160 8.337 12.679 -2.487
dquote> ATOM 2518 OXT VAL 160 7.646 12.461 -0.386
dquote> TER 
dquote> ATOM 2519 N  VAL 161 -14.431  5.789 -25.371
dquote> ATOM 2520 H1 VAL 161 -15.336  5.698 -25.811
dquote> ATOM 2521 H2 VAL 161 -13.416 10.529  17.708
dquote> ATOM 2522 H3 VAL 161 -14.363  9.436  18.498" |sed '/^TER/d'

ATOM 2517 O   VAL 160 8.337 12.679 -2.487
ATOM 2518 OXT VAL 160 7.646 12.461 -0.386
ATOM 2519 N  VAL 161 -14.431  5.789 -25.371
ATOM 2520 H1 VAL 161 -15.336  5.698 -25.811
ATOM 2521 H2 VAL 161 -13.416 10.529  17.708
ATOM 2522 H3 VAL 161 -14.363  9.436  18.498

обновлено на основе нового требования

см. Строку awk ниже:

kent$  cat t.txt
ATOM 2517 O   VAL 160 8.337 12.679 -2.487
ATOM 2518 OXT VAL 160 7.646 12.461 -0.386
TER 
ATOM 2519 N  VAL 161 -14.431  5.789 -25.371
ATOM 2520 H1 VAL 161 -15.336  5.698 -25.811
ATOM 2521 H2 VAL 161 -13.416 10.529  17.708
ATOM 2522 H3 VAL 161 -14.363  9.436  18.498

kent$  awk 'NR==FNR{if ($0~/^TER/)a[NR]=1;}NR>FNR{f=0;for(x in a){if(FNR>=x-1 && FNR<=x+3){f=1;break;}}if(!f){print $0;}f=0}' t.txt t.txt
ATOM 2517 O   VAL 160 8.337 12.679 -2.487
ATOM 2522 H3 VAL 161 -14.363  9.436  18.498

обновлено снова

Я надеюсь, что это последнее обновление:

awk line:

awk 'NR==FNR{if ($0~/^TER/)a[NR]=1;}NR>FNR{f=0;for(x in a){if(FNR==x-1 || FNR==x || (FNR>x+1 && FNR<=x+4)){f=1;break;}}if(!f){print $0;}f=0}' yourFile yourFile

test:

kent$  cat t.txt
ATOM 2517 O   VAL 160 8.337  12.679  -2.487
ATOM 2518 OXT VAL 160 7.646  12.461  -0.386
TER 
ATOM 2519 N   VAL 161 -14.431  5.789 -25.371
ATOM 2520 H1  VAL 161 -15.336  5.698 -25.811
ATOM 2521 H2  VAL 161 -13.416 10.529  17.708
ATOM 2522 H3  VAL 161 -14.363  9.436  18.498
ATOM 2523 CA  VAL 161   4.400  9.233  16.454
ATOM 2524 HA  VAL 161   3.390  9.170  16.047

kent$  awk 'NR==FNR{if ($0~/^TER/)a[NR]=1;}NR>FNR{f=0;for(x in a){if(FNR==x-1 || FNR==x || (FNR>x+1 && FNR<=x+4)){f=1;break;}}if(!f){print $0;}f=0}' t.txt t.txt
ATOM 2517 O   VAL 160 8.337  12.679  -2.487
ATOM 2519 N   VAL 161 -14.431  5.789 -25.371
ATOM 2523 CA  VAL 161   4.400  9.233  16.454
ATOM 2524 HA  VAL 161   3.390  9.170  16.047
0 голосов
/ 22 октября 2011

ed отлично подходит для такого рода вещей:

$ ed -s file.txt <<EOF
> /^TER/d
> -1d
> +1d
> d
> d
> ,p
> EOF

p в строке, следующей за последней, напечатает результат;измените его на w для редактирования на месте и сохраните в тот же файл.

0 голосов
/ 20 октября 2011

Грубая сила в наши дни кажется непопулярной, но в любом случае она такова:

perl -e 'undef $/; ($a=<>)=~s!(.*\n){1}TER\n(.*\n)(.*\n){3}!$2!; print $a;' INFILE > OUTFILE

Метод, конечно, предполагает, что входной файл соответствует оперативной памяти.


P.S. Если ввод больше, чем RAM, то нужен простой конечный автомат. Читать файл построчно в цикле. push строк в промежуточный буфер. Если в буфере более 4 строк, shift и распечатайте головку. Если вторая строка в буфере - TER и буфер содержит 4 строки, очистите буфер. Повторите, пока есть линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...