在bash脚本/awk/python中从大集合生成数字组

在bash脚本/awk/python中从大集合生成数字组,python,awk,sed,data-science,Python,Awk,Sed,Data Science,我想创建许多索引组。我的输入文件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

我想创建许多索引组。我的输入文件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初学者?

假设您的输入文件总是按递增顺序索引,并且根据显示的示例,没有数字丢失,请尝试以下内容

无论文件大小如何,这段代码都应该非常快,因为文件的最后一个元素将被视为最大的数字,直到for循环应该运行到哪里

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 ""
}'

请您尝试以下内容,假设您的输入_文件始终仅按递增顺序索引,并且根据显示的示例,没有数字丢失

无论文件大小如何,这段代码都应该非常快,因为文件的最后一个元素将被视为最大的数字,直到for循环应该运行到哪里

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 ""
}'

如果我理解正确的话,这是由27个项目组成的分组整数组成的

我(个人和个人喜好)会推荐python
itertools
,因为这与“如何按x项的块分组”是完全相同的问题

见:


这个问题已经用我重新表述的方式回答了好几次了

如果我理解正确,这包括将整数按27个项目的块分组

我(个人和个人喜好)会推荐python
itertools
,因为这与“如何按x项的块分组”是完全相同的问题

见:


这个问题已经用我重新表述的方式回答了好几次了

我是分子动力学方面的局外人,但是如果我理解正确,
index.ndx
文件将用于应用。您可以找到一个示例文件。从文件中的元素判断,数字是按递增顺序排列的,但并不总是按1递增。我担心OP显示的示例可能有误导性,OP应该添加一些关于该文件的解释。@tshiono,谢谢你的评论,是的,我在回答中确实提到过这种情况。我会等你来的。我还将尝试使解决方案更通用,这将阅读文件的内容,并在我的回答中发布,干杯。我是分子动力学的局外人,但如果我理解正确,将使用
index.ndx
文件进行应用。您可以找到一个示例文件。从文件中的元素判断,数字是按递增顺序排列的,但并不总是按1递增。我担心OP显示的示例可能有误导性,OP应该添加一些关于该文件的解释。@tshiono,谢谢你的评论,是的,我在回答中确实提到过这种情况。我会等你来的。我还将尝试使解决方案更通用,这将阅读文件的内容,并在我的回答后的某个时候,干杯。
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)