Заменить столбец между шаблонами в одном файле из другого файла - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь написать сценарий оболочки, который читает file1, получить определенный столбец из этого файла.И замените столбец в file2 на столбец, извлеченный из file1 между двумя шаблонами.

File1

Line1
Line2
.
LineN
ATOM C1 C2 C3
ATOM P23 HI IKJ
ATOM S23 JSK SN
BOND
Many lines
END

File2

Few Lines
Pattern1
1 C -9.2429 -1.3783 -9.5091 C.3 1 LIG1 0.0555
2 C -10.5865 -0.8658 -8.9679 C.3 1 LIG1 0.0529
3 N -11.3072 -0.5779 -10.1774 N.am 1 LIG1 -0.2940
Patttern2
Lines

Я хочу получить столбец $ 2 из файла1 и замените его столбцом $ 2 в file2 между pattern1 и pattern 2.

Вывод

Few Lines
Pattern1
1 C1 -9.2429 -1.3783 -9.5091 C.3 1 LIG1 0.0555
2 P23 -10.5865 -0.8658 -8.9679 C.3 1 LIG1 0.0529
3 S23 -11.3072 -0.5779 -10.1774 N.am 1 LIG1 -0.2940
Patttern2
Lines

До сих пор я пробовал несколько вещей.

awk '($1=="ATOM") {print $2}' file1
awk '/pattern1/{flag=1; next} /pattern2/{flag=0} flag' file2

Iможет хранить столбец 2 в файле1.Кроме того, линии между обоими образцами из файла 2.

Я уверен, что с чем-то вроде FNR = NR, я должен иметь возможность обрабатывать оба файла одновременно.Любая помощь была бы велика, чтобы продолжить.

1 Ответ

0 голосов
/ 22 ноября 2018

По вашему вопросу и как вы упомянули решение (FNR == NR) Вы можете использовать этот AWK:

awk '
( FNR==NR && /^ATOM / ) { atoms[++atomn]=$2; }
( FNR!=NR && /^Patttern2$/ ) { doreplace=0; }
doreplace { $2=atoms[++atomn]; }
( FNR!=NR && /^Pattern1$/ ) { doreplace=1; atomn=0; }
FNR!=NR
' file1 file2

Я предпочитаю этот способ при работе с метафайлами и файлами данных:

awk '
BEGIN {
  if ( ARGC != 3 ) exit(1);
  while ( getline < ARGV[2] ) if ( $0 ~ /^ATOM / ) atoms[++atomn]=$2;
  ARGC=2;
}
/^Patttern2$/ { doreplace=0; }
doreplace { $2=atoms[++atomn]; }
/^Pattern1$/ { doreplace=1; atomn=0; }
1
' file2 file1

Оба будут работать на ваших предоставленных входах.Вот вывод:

Few Lines
Pattern1
1 C1 -9.2429 -1.3783 -9.5091 C.3 1 LIG1 0.0555
2 P23 -10.5865 -0.8658 -8.9679 C.3 1 LIG1 0.0529
3 S23 -11.3072 -0.5779 -10.1774 N.am 1 LIG1 -0.2940
Patttern2
Lines

В обоих случаях предполагается, что в метафайле (файл1) и файле данных (файл2) у вас точно такое же количество ATOM и строк между шаблонами.Если вы не можете проверить это, я бы добавил логику, чтобы следить за тем, чтобы не перебирать элементы массива.Однако в AWK ничего не произойдет, вместо этого будет сделана замена на пустую строку.

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