Linux 我想用fortran编辑我的fortran生成的文件

Linux 我想用fortran编辑我的fortran生成的文件,linux,file,fortran,editing,fortran95,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 在我的程序中,我将这些值写入一个文件,但在两个温度值之间,我

我有一个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乘以温度连续值之间的值

我不知道如何调用一个文件并删除我不想要的特定部分,然后再次保存它

NB

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


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

open(unit, action='write', position='append') 
在结尾追加新的写入,而

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

将删除现有内容并从头开始书写。

据我所知,您确切知道要保留多少行(
N\u 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循环,并为较小文件的名称创建一个数组,这样在第二个open语句中,您可以说类似于
file=name(temp)的内容

您不清楚要保留什么,但在任何情况下,作为从文件中删除某些内容的一般原则(无论使用何种语言),您都会重写整个文件,忽略要删除的内容。对于这个例子,我想你最好的方法是将你需要的东西保存在内存中,每次都重新写入整个文件。@george文件非常大。如果你在类似Linux的平台上,请熟悉一些实用程序,例如
grep
split
cut
,这些都可以用来从文件中提取位。如果您使用的是类似Windows的平台,请找出本地等价物。这不是一个非常直接的答案,但是反转“do x”和“do y”循环可能会加快速度,因为您的代码将能够更直接地跟踪“数组”。当然,您必须记住,这会改变输出的顺序。您好,欢迎访问此网站。请务必阅读帮助并熟悉常见的答案形式和格式功能。我会在你的第一篇文章中做一些基本的格式设置,但在我看来仍然有点不清楚这应该如何解决这个问题。
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