2013-07-16 33 views
-1

我有两个文本文件。一个是Fortran程序的输入文件,另一个是两列(许多行)有实数。如果我可以用第二个文件的每一行多次替换第一个文件的第三行,那么我可以自动执行我的任务。我想用文件2的NR = 1替换文件1中的NR = 3,运行输入。用文件二的NR = 2再次替换文件1中的NR = 3,运行输入。依此类推。 我想在Windows上使用批处理文件和gawk,grep,sed。 (gawk,grep,sed和其他unix/linux命令通过unxutil在windows上可用)。可能吗?任何帮助?例如: 第一个文件用第二个文件的每一行多次替换第一个文件的一行

1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 
17.01425 0.00000 
0.0 0.0 1.000 1.000 2700.0  
0.0 0.0 0.0 0.0 0.0       
100.0 290.0        
1 360.0         
310.0 800.0 2700.0 2700.0     
    2 10 360.0     

第二文件

17.01425 0.00000 
17.37597 10.00000 
17.73771 20.00000 
18.09943 30.00000 
................ 

我想第一(17.01425 0.00000)的3ND线由第二文件(17.73771 20.00000等中的每一行被替换)。

+1

提供输入文件的样本和您的预期输出。 – anubhava

+0

输入文件1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 17.01425 0.00000 0.0 0.0 1.000 1.000 2700.0 0.0 0.0 0.0 0.0 0.0 100.0 290.0 1 360.0 310.0 800.0 2700.0 2700.0 2 10 360.0 第二个文件17.01425 0.00000 17.37597 10.00000 17.73771 20.00000 18.09943 30.00000 ................我希望将第一行的第二行(17.01425 0.00000)替换为第二个文件的每行(17.73771 20.00000)等。 –

+0

请勿在评论中提供数据。请通过编辑您的问题发布这些样本。 – anubhava

回答

2

这部分的猜测工作没有一些期望的输出,但是这可能是你想要什么:

awk ' 
NR==FNR { file1[NR]=$0; next } 
{ 
    for (i=1; i<=(NR-FNR); i++) 
     print (i==3 ? $0 : file1[i]) > ("outfile" FNR) 
} 
' file1 file2 
+0

我希望第一个文件的第三行按第二个文件的每一行进行更改。这样我可以获得许多与第一个文件等效但不同的第三行文件。确切地说,现在我想改变43次,因为我的第二个文件有43行。我希望从文件1生成的所有这43个文件都被输入到一个更大的fortran程序中,我希望使用批处理文件调用43个文件。由于某些限制,我将在Windows平台上完成所有这些工作。 –

+0

我可以用我有限的知识来实现​​它。它只是工作而不应用任何改变。非常感谢!!! –

1

这里有一个建议:

while read line 
do 
    sed -i "3c${line}" file1.txt 
    # do whatever you need to with the modified file 
done < file2.txt 

如果需要保留原始file1.txt,改变sed line to:

sed "3c${line}" <file1.txt> tempfile.txt 

并运行您的后续命令对临时文件,而不是...

+0

您需要设置IFS =并添加-r标志以进行读取。您还需要处理file2中的一行为空,因为这会导致sed出现语法错误,并考虑sed如何处理反斜杠和其他file2字符。 –

+0

@EdMorton鉴于给出的示例输入,我不相信在这种特殊情况下'IFS ='或'read -r'是必需的,尽管它们在更一般的情况下是绝对有用的。然而,检查空输入可能是一个好主意 - 但主要目的是建议框架,但不提供完全调试和完全防弹缩小包装解决方案... – twalberg

+0

使用IFS =和-r不是东西当你发现需要的时候添加 - 你应该总是设置IFS =并且使用read -r,除非你有一个非常具体的原因不太像,你应该总是引用你的shell变量。问题是,该框架不能很好地工作,因为它需要处理太多的“特殊”情况 - 你根本无法使这种方法稳健,不像awk解决方案发布,甚至,我认为,如果你使用awk而不是sed作为循环内部的命令(但外部循环本身将是多余的)。 –

相关问题