Правильно ли оставить пространство между столбцами в awk (ширина каждого поля)? - PullRequest
0 голосов
/ 14 марта 2020

У меня огромная проблема. Я работаю с файлами .gro, которые выглядят так:

    1BGL     C5    1   2.636  14.120   1.951 -0.0345 -0.8088 -0.2809
    1BGL     H5    2   2.573  14.031   1.945  0.1969 -1.0999  1.1792
    1BGL     O5    3   2.567  14.198   1.847 -1.0918 -0.2789 -0.0370
    1BGL     C1    4   2.644  14.307   1.793 -0.3029 -0.4378 -0.4234
    1BGL     H1    5   2.600  14.360   1.709  1.4710  0.2783 -0.9469
    1BGL     C2    6   2.794  14.277   1.750  0.2264  0.3957  0.6673
    1BGL     H2    7   2.855  14.363   1.723  0.7219  0.1907  1.1240
    1BGL     O2    8   2.787  14.184   1.640 -0.1728 -0.5002 -0.0302
    1BGL    HO2    9   2.788  14.247   1.569  1.3442 -0.4575  0.0054
    1BGL     C3   10   2.868  14.205   1.867  0.4088  0.4514  0.0495
    1BGL     H3   11   2.962  14.157   1.840  0.0154 -2.1311  2.8580
    1BGL     O3   12   2.901  14.298   1.973  0.0978  0.1123 -0.2596
    1BGL    HO3   13   2.942  14.246   2.040 -1.2865  3.4404  3.5009
    1BGL     C4   14   2.783  14.089   1.918  0.6092  0.5852 -0.0412
    1BGL     H4   15   2.786  14.021   1.832  0.7162 -0.0675  0.4699
    1BGL     O4   16   2.854  14.040   2.031  0.3832 -0.0763 -0.6561

Когда я использую awk, это выглядит как

1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C1 4 2.644 14.307 1.793 -0.3029 -0.4378 -0.4234
1BGL H1 5 2.600 14.360 1.709 1.4710 0.2783 -0.9469
1BGL C2 6 2.794 14.277 1.750 0.2264 0.3957 0.6673
1BGL H2 7 2.855 14.363 1.723 0.7219 0.1907 1.1240
1BGL O2 8 2.787 14.184 1.640 -0.1728 -0.5002 -0.0302
1BGL HO2 9 2.788 14.247 1.569 1.3442 -0.4575 0.0054
1BGL C3 10 2.868 14.205 1.867 0.4088 0.4514 0.0495
1BGL H3 11 2.962 14.157 1.840 0.0154 -2.1311 2.8580
1BGL O3 12 2.901 14.298 1.973 0.0978 0.1123 -0.2596
1BGL HO3 13 2.942 14.246 2.040 -1.2865 3.4404 3.5009
1BGL C4 14 2.783 14.089 1.918 0.6092 0.5852 -0.0412
1BGL H4 15 2.786 14.021 1.832 0.7162 -0.0675 0.4699
1BGL O4 16 2.854 14.040 2.031 0.3832 -0.0763 -0.6561

Вы можете прочитать об этом здесь http://manual.gromacs.org/archive/5.0.4/online/gro.html

Этот формат является фиксированным, ie. все столбцы находятся в фиксированном положении. При желании (пока только с trjconv) вы можете записывать файлы gro с любым количеством десятичных знаков, тогда формат будет n + 5 позиций с n десятичными знаками (n + 1 для скоростей) вместо 8 с 3 (с 4 для скоростей). После прочтения точность будет определяться из расстояния между десятичными точками (которое будет n + 5). Столбцы содержат следующую информацию (слева направо):

residue number (5 positions, integer)
residue name (5 characters)
atom name (5 characters)
atom number (5 positions, integer)
position (in nm, x y z in 3 columns, each 8 positions with 3 decimal places)
velocity (in nm/ps (or km/s), x y z in 3 columns, each 8 positions with 4 decimal places) 

Обратите внимание, что отдельные молекулы или ионы (например, вода или Cl-) считаются остатками. Если вы хотите записать такой файл в своей собственной программе без использования библиотек GROMACS, вы можете использовать следующие форматы:

C формат "% 5d% -5s% 5s% 5d% 8.3f% 8.3f % 8.3f% 8.4f% 8.4f% 8.4f "

Поэтому я хочу правильно сохранить пространство между столбцами после использования awk. Можно ли сделать это, как в C, используя, например, printf ("% 8i% 6 i", column1, column2)?

Например, я использую этот скрипт

#!/bin/bash
awk '
FNR==1{
  ++count
  value=count"BGL"
}
{
  $1=value
}
1
FNR%3==0{
  ++count
  value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro

Фрагмент моего ввода

    1BGL     C5    1   2.636  14.120   1.951 -0.0345 -0.8088 -0.2809
    1BGL     H5    2   2.573  14.031   1.945  0.1969 -1.0999  1.1792
    1BGL     O5    3   2.567  14.198   1.847 -1.0918 -0.2789 -0.0370
    1BGL     C5  130   6.603  15.918   1.894 -0.6780  0.4970 -0.5245
    1BGL     H5  131   6.632  15.913   1.999  0.6027 -3.0418 -0.9360
    1BGL     O5  132   6.497  16.023   1.909 -1.1935  0.9474 -0.2080
    1BGL     C5  259   5.066   8.182   0.249 -0.2465 -0.7831 -0.0006
    1BGL     H5  260   5.085   8.166   0.355  2.0262 -0.0662 -0.2570
    1BGL     O5  261   5.080   8.322   0.226 -0.6550 -0.0725 -0.0582

И мой вывод

1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
2BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
2BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
2BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
3BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
3BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
3BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582

Нет, это невозможно использовать этот файл в программе GROMACS, потому что ему нужно правильно пространство между столбцом

1 Ответ

1 голос
/ 14 марта 2020

Сценарий, который вы опубликовали, не производит вывод, который вы опубликовали, но если бы он это сделал, вот что вы изменили бы на:

$ cat tst.awk
FNR==1{
  ++count
  value=count"BGL"
}
{
  match($0,/^[[:space:]]*[^[:space:]]+/)
  $0 = sprintf("%*s%s",RLENGTH,value,substr($0,RLENGTH+1))
}
1
FNR%22==0{
  ++count
  value=count"BGL"
}

Вот как я бы действительно написал сценарий, который вы используя, хотя, чтобы получить вывод, который вы опубликовали, чтобы вы не писали дублирующийся код для увеличения count и установки value, и вам все равно не нужны переменные count или value:

$ cat tst.awk
{
    match($0,/^[[:space:]]*[0-9]+/)
    printf "%*d%s\n", RLENGTH, int(((NR-1)/3)+1), substr($0,RLENGTH+1)
}

$ awk -f tst.awk file
    1BGL     C5    1   2.636  14.120   1.951 -0.0345 -0.8088 -0.2809
    1BGL     H5    2   2.573  14.031   1.945  0.1969 -1.0999  1.1792
    1BGL     O5    3   2.567  14.198   1.847 -1.0918 -0.2789 -0.0370
    2BGL     C5  130   6.603  15.918   1.894 -0.6780  0.4970 -0.5245
    2BGL     H5  131   6.632  15.913   1.999  0.6027 -3.0418 -0.9360
    2BGL     O5  132   6.497  16.023   1.909 -1.1935  0.9474 -0.2080
    3BGL     C5  259   5.066   8.182   0.249 -0.2465 -0.7831 -0.0006
    3BGL     H5  260   5.085   8.166   0.355  2.0262 -0.0662 -0.2570
    3BGL     O5  261   5.080   8.322   0.226 -0.6550 -0.0725 -0.0582
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...