Создание групп чисел из большого набора в bash scripts / awk / python - PullRequest
0 голосов
/ 20 января 2020

Я хочу создать много индексных групп. Мой входной файл file.ndx

[ System ]
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45
  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
  61   62   63   64   65   66   67   68   69   70   71   72   73   74   75
  76   77   78   79   80   81   82   83   84   85   86   87   88   89   90
  91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
 106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
 121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
 136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
 151  152  153  154  155  156  157  158  159  160  161  162  163  164  165
 166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
 181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
 196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
 211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
 226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
......





...... 116100

Я должен создать каждую индексную группу атомов, например, 1 молекула = 27 атомов, поэтому мой вывод будет:

[ MGDG1 ]
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
  16   17   18   19   20   21   22   23   24   25   26   27
[ MGDG2 ]
  28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   
  43   44   45   46   47   48   49   50   51   52   53   54
[ MGDG3 ]
  55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   
  70   71   72   73   74   75   76   77   78   79   80   81  

etc.

Что такое Самый простой способ сделать это? Я пишу bash скрипты (также sed и awk), и я новичок в python?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Я (лично и по личному вкусу) рекомендовал бы python itertools рецепты , поскольку он состоит из правильного понимания группирования целых чисел по 27 частям, см.

import itertools
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return iterttools.zip_longest(*args, fillvalue=fillvalue)

atoms = range(1, 116101)
it = grouper(atoms, 27)

На этот вопрос уже несколько раз отвечали, как я его перефразировал

1 голос
/ 20 января 2020

Не могли бы вы попробовать следующее, предполагая, что ваш Input_file всегда имеет индексы только в порядке возрастания, и в соответствии с показанными образцами не пропущено ни одно число.

Этот код должен быть довольно быстрым независимо от размера файла, поскольку последний элемент файла берется в качестве наибольшего числа до того места, где должно выполняться l oop.

awk -v last=$(tac Input_file| awk 'FNR==1{print $NF;exit}') '
BEGIN{
  OFS="\t"
  for(i=1;i<=last;i++){
    if(i==1){
       print "[ MGDG"++count " ]"
    }
    printf("%s%s",++occur==15?ORS OFS:OFS,i)
    occur=occur==15?0:occur
    if(i%27==0){
      print "\n[ MGDG"++count " ]"
      occur=""
    }
  }
  print ""
}'

У меня есть проверил это только с 240 пунктами, и это дает следующий вывод.

[ MGDG1 ]
        1       2       3       4       5       6       7       8       9       10      11      12      13      14
        15      16      17      18      19      20      21      22      23      24      25      26      27
[ MGDG2 ]
        28      29      30      31      32      33      34      35      36      37      38      39      40      41
        42      43      44      45      46      47      48      49      50      51      52      53      54
[ MGDG3 ]
        55      56      57      58      59      60      61      62      63      64      65      66      67      68
        69      70      71      72      73      74      75      76      77      78      79      80      81
[ MGDG4 ]
        82      83      84      85      86      87      88      89      90      91      92      93      94      95
        96      97      98      99      100     101     102     103     104     105     106     107     108
[ MGDG5 ]
        109     110     111     112     113     114     115     116     117     118     119     120     121     122
        123     124     125     126     127     128     129     130     131     132     133     134     135
[ MGDG6 ]
        136     137     138     139     140     141     142     143     144     145     146     147     148     149
        150     151     152     153     154     155     156     157     158     159     160     161     162
[ MGDG7 ]
        163     164     165     166     167     168     169     170     171     172     173     174     175     176
        177     178     179     180     181     182     183     184     185     186     187     188     189
[ MGDG8 ]
        190     191     192     193     194     195     196     197     198     199     200     201     202     203
        204     205     206     207     208     209     210     211     212     213     214     215     216
[ MGDG9 ]
        217     218     219     220     221     222     223     224     225     226     227     228     229     230
        231     232     233     234     235     236     237     238     239     240
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...