Linux 我想用fortran编辑我的fortran生成的文件
我有一个fortran 95程序,它以以下形式编写数组: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 在我的程序中,我将这些值写入一个文件,但在两个温度值之间,我
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