我想在fortran中编辑我的fortran生成的文件

时间:2014-11-04 10:54:04

标签: linux file fortran editing fortran95

我有一个fortran 95程序,它以这种形式写一个数组:

do temp = 1, temp_final 
  do MC = 1, N_MC
    do x = 0, N
      do y = 0, M
        write(1,*) x, y, array(x,y)
      enddo
    enddo
  enddo
    write(1,*) T
    T = T - temp*factor
enddo

在我的程序中,我将这些值写入文件,但是在两个温度值之间,我写的不止一次(但是N_MC次)x,y数组(x,y)值,因为它们在MC内部循环,进入N_MC步骤。

由于文件仅生成,并且程序运行需要很长时间,因此如果您可以建议任何技术来编辑已生成的文件并仅保留第一组值并将它们传输到另一个文件或编辑父文件,并保持变化。

我的文件看起来像这样

 Temp  0.69999999999999998 !(initial value)
       0           0  -1.0000000000000000     
       0           1  -1.0000000000000000     
       0           2  -1.0000000000000000     
       0           3   1.0000000000000000     
       0           4   1.0000000000000000          
       1           0  -1.0000000000000000     
       1           1   1.0000000000000000     
       1           2   1.0000000000000000     
       1           3  -1.0000000000000000     
       1           4  -1.0000000000000000         
       2           0  -1.0000000000000000     
       2           1   1.0000000000000000     
       2           2  -1.0000000000000000     
       2           3   1.0000000000000000     
       2           4   1.0000000000000000         
       3           0  -1.0000000000000000     
       3           1  -1.0000000000000000     
       3           2   1.0000000000000000     
       3           3  -1.0000000000000000     
       3           4  -1.0000000000000000     

       0           0   1.0000000000000000     
       0           1  -1.0000000000000000     
       0           2   1.0000000000000000     
       0           3   1.0000000000000000     
       0           4  -1.0000000000000000          
       1           0   1.0000000000000000     
       1           1   1.0000000000000000     
       1           2   1.0000000000000000     
       1           3  -1.0000000000000000     
       1           4  -1.0000000000000000         
       2           0  -1.0000000000000000     
       2           1   1.0000000000000000     
       2           2  -1.0000000000000000     
       2           3   1.0000000000000000     
       2           4   1.0000000000000000         
       3           0  -1.0000000000000000     
       3           1  -1.0000000000000000     
       3           2   1.0000000000000000     
       3           3  -1.0000000000000000     
       3           4  -1.0000000000000000
       ..........       
        N_MC-2 times (as two sets are already shown) !( after that there is new temp having new array values)

 Temp  0.59999999999999998  ! like this, I am having array values for diff. temp
 .
 .
 .
 Temp  0.09999999999999998 !(final vaule)

我想保留第一组值,而不是在那之后.......... N_MC乘以连续的temp值之间的值。

我不知道如何调用文件并删除我不想要的特定部分并再次保存。

NB

我只想传输第一组值0-3,0-9,数组(i,j)

       0           0  -1.0000000000000000     
       0           1  -1.0000000000000000     
       0           2  -1.0000000000000000     
       0           3   1.0000000000000000     
       0           4   1.0000000000000000          
       1           0  -1.0000000000000000     
       1           1   1.0000000000000000     
       1           2   1.0000000000000000     
       1           3  -1.0000000000000000     
       1           4  -1.0000000000000000         
       2           0  -1.0000000000000000     
       2           1   1.0000000000000000     
       2           2  -1.0000000000000000     
       2           3   1.0000000000000000     
       2           4   1.0000000000000000         
       3           0  -1.0000000000000000     
       3           1  -1.0000000000000000     
       3           2   1.0000000000000000     
       3           3  -1.0000000000000000     
       3           4  -1.0000000000000000
       ! Not after that for Temp = 0.6999999999990

到单个温度的文件。

2 个答案:

答案 0 :(得分:0)

当您关闭并重新打开现有的Fortran文件时,您可以说出第一次写入的位置。

open(unit, action='write', position='append') 

在最后添加新的写入,而

open(unit, action='write', position='rewind', status='replace') 

将删除现有内容并开始写入。

答案 1 :(得分:0)

根据我的理解,您确切地知道要保留多少行(N_MC*N*M?),为了给出答案,您可以使用,假设您要保留

KeepLines=N_MC*N*M

然后你可以做的是使用以下open语句调用read语句并立即调用write语句:

open (file="/path/yourBigFile", unit=13, access="sequential", status="old", action="read")  
open(unit=12, file="/path/yourSmallerFile", status="new", position="append", action="write")  
do i=0,KeepLines-1  !!Watch out for indexes here and be sure to have defined xx,yy, arr  
    read(13,*) xx,yy,arr  
    write(12,*) xx,yy,arr  
enddo

如果您不仅需要第一个块而且需要所有不同的块,这种方法很容易推广:只需在两个open语句之间对temp进行do循环,并为小文件的名称创建一个数组,以便在第二个公开声明你可以说file=name(temp)