2016-11-25 5 views
0

Я хочу заменить второй столбец в файле ниже, но не для всех строк.gawk заменить столбец и приращение, но не для всех строк

Я попытался это: gawk 'BEGIN{a=0} {gsub($2, a++); print $0}' filein > fileout;

Но это отчасти портит несколько строк, например, когда он говорит, ТЕР и END.

Filein выглядит следующим образом: ATOM 6513 N CYX D 438 6.267 -19.583 33.328 1.00 99.72 N ATOM 6514 CA CYX D 438 5.026 -19.379 34.078 1.00 99.72 C ATOM 6515 C CYX D 438 5.441 -19.597 35.520 1.00 99.72 C ATOM 6516 O CYX D 438 4.662 -19.960 36.400 1.00 99.72 O ATOM 6517 CB CYX D 438 3.940 -20.381 33.611 1.00 99.72 C ATOM 6518 SG CYX D 438 3.155 -19.991 32.020 1.00 99.72 S TER HETATM 1 C1 L35 900 -11.042 -69.780 -18.443 1.00 0.00 C HETATM 2 C2 L35 900 -9.989 -68.975 -18.009 1.00 0.00 C HETATM 3 C3 L35 900 -11.968 -70.232 -17.506 1.00 0.00 C CONECT 324 1315 CONECT 2005 2938 CONECT 3228 6518 CONECT 3528 4682 CONECT 5373 6190 ENDMDL END

Я хочу, чтобы этот файл выглядеть следующим образом:

ATOM 1 N CYX D 438 6.267 -19.583 33.328 1.00 99.72 N ATOM 2 CA CYX D 438 5.026 -19.379 34.078 1.00 99.72 C ATOM 3 C CYX D 438 5.441 -19.597 35.520 1.00 99.72 C ATOM 4 O CYX D 438 4.662 -19.960 36.400 1.00 99.72 O ATOM 5 CB CYX D 438 3.940 -20.381 33.611 1.00 99.72 C ATOM 6 SG CYX D 438 3.155 -19.991 32.020 1.00 99.72 S TER HETATM 7 C1 L35 900 -11.042 -69.780 -18.443 1.00 0.00 C HETATM 8 C2 L35 900 -9.989 -68.975 -18.009 1.00 0.00 C HETATM 9 C3 L35 900 -11.968 -70.232 -17.506 1.00 0.00 C CONECT 324 1315 CONECT 2005 2938 CONECT 3228 6518 CONECT 3528 4682 CONECT 5373 6190 ENDMDL END

+0

Как выглядит ваш файл? – bli

+0

gawk - один из вариантов awk. ** FAR ** больше людей увидят ваш вопрос, если вы помечаете его awk вместо, или в дополнение к gawk. Вероятно, у вас был бы ваш ответ несколько недель назад. –

ответ

0

Так что, если вы хотите, чтобы искать строки (TER, CONECT, ENDML) не быть включенным, то последующие могут помочь вам в этом.

awk 'NF>1 && $1 !~ /TER/ && $1 !~ /CONECT/ && $1 !~ /ENDMDL/ && $1 !~ /END/{$2=++a} 1' Input_file 

В случае, если ваш input_file есть строки (ENDMDL, END) всегда одна запись столбца, то вы можете попробовать следующее тогда.

awk 'NF>1 && $1 !~ /TER/ && $1 !~ /CONECT/{$2=++a} 1' Input_file 

Надеюсь, это вам поможет.

+1

Все, что вам нужно для тестирования, это 'NF> 3'. Обратите внимание, что '$ 2 = ++ a' изменяет пробелы между полями, тогда как' sub ($ 2, ++ a) 'не будет. –