使用batch或perl脚本将两个文本文件合并为一个文件

时间:2013-10-19 09:47:03

标签: perl shell batch-file

您好我是脚本和搜索解决方案的新手。我有两个不同名称的文本文件,我想将它们合并到一个新的第三个文本文件中。每个文本文件的格式都完全相同,就像那样。每个文本文件都有一些(相同数量的)行,以#符号开头,后跟一些文本。在那些以#符号开头的行之后。我会有以数字开头的行。这些行将包含由空格分隔的三列数字。两个文件中前两列中的数字相同,而第三列中的数字则不同。在几百行之后,我可能会再次以#符号开头的行,然后是像以前一样以三列中的数字开头的行,这可以重复多次。现在这就是我想做的事情。 我想创建一个新的文本文件,它将以#符号开头的行完全从第一个文本文件中复制。我想完全按原样复制前两列数字。这两列可以从第一个文本文件或第二个文本文件中复制,因为它们将是相同的inboth文件。现在,对于新文本文件中的第三列,我想在前两个文件的第三列中添加数字

新文本文件的第三列中的数字=(第一个文件的第三列中的数字+第二个文件的第三列中的数字)

在某些行之后,我可能会再次使用带#符号的行,然后是行,后跟3列中的数字。这可以重复。

示例下面给出了只有一个文本文件的格式。第二个文本文件格式完全相同。

# 
# 
# 
# 
# 
# 
# 
 0.0   0.0 4.4226
 0.0   5.0 4.4246
 0.0  10.0 4.4456
 0.0  15.0 4.4876
 0.0  20.0 4.4453
 0.0  25.0 5.6585
 .
 .
 .
 .
# 
# 
#
# 
#
 0.0   0.0 0.410135
 0.0   5.0 0.745745
 0.0  10.0 0.574555
 0.0  15.0 0.415675
 0.0  20.0 0.575454
 0.0  25.0 0.410135
 0.0  30.0 0.678768
 0.0  35.0 0.410135
 0.0  40.0 0.976876
 0.0  45.0 0.678678
 0.0  50.0 0.410135
 0.0  55.0 0.678976
 0.0  60.0 0.410135
 0.0  65.0 0.687876
 0.0  70.0 0.768677
 .
 .
 .
 .
 .
 .

这种带有#符号和三列数字的行格式可以重复。三列中带有数字的行具有由空格分隔的列,并且在带有数字的这些行的开头也有一个空格。 我希望我做得很好解释。我更喜欢bacth脚本,因为它很容易运行。然而perl也会起作用。非常感谢您的帮助。非常感谢。

新文件格式与其他两个文件完全相同,第三列是第一个和第二个txt文件第三列中的数字总和。样本第三文件格式如下。

# 
# 
# 
# 
# 
# 
# 
 0.0   0.0 8.4355
 0.0   5.0 6.3553
 0.0  10.0 6.4327
 .
 .
 .
 .
# 
# 
# 
# 
# 
 0.0   0.0 4.832735
 0.0   5.0 7.436343
 0.0  10.0 0.323325
 0.0  15.0 4.876656
 .
 .
 .
 .
 .
 .

再次非常感谢你。我很头疼,因为我有很多这些文件。非常感谢你的帮助。

文件1在这里

# 
# 
# 
# 
# 
#
# 
 0.0   0.0 5.30562
 0.0   5.0 5.30562
 0.0  10.0 1.4852
90.0 355.0 1.99511
# 
# 
# 
# 
# 
 0.0   0.0 0.948027
 0.0   5.0 0.948027
90.0 355.0 1.54

文件2是

# 
# 
# 
# 
# 
# 
# 
 0.0   0.0 1.4621
 0.0   5.0 1.4621
 0.0  10.0 1.4621
90.0 355.0 3.3359
# 
# 
# 
# 
# 
 0.0   0.0 0.747458
 0.0   5.0 0.747458
90.0 355.0 0.550766

现在你可以检查我认为在开头和列之间有空格的问题

1 个答案:

答案 0 :(得分:0)

请尝试使用awk

awk 'NR==FNR {if($3~/[0-9]+\.[0-9]+/){a[i++]=$3}; next} \
     $3~/[0-9]+\.[0-9]+/ {$3=$3+a[j++]} \
     1' file1 file2 > file3

测试注释中指定的样本输入:

$ cat file1
# comment here
90.0 355.0 1.54

$ cat file2
# comment here
90.0 355.0 0.550766

$ awk 'NR==FNR {if($3~/[0-9]+\.[0-9]+/){a[i++]=$3}; next} \
?      $3~/[0-9]+\.[0-9]+/ {$3=$3+a[j++]} \
?      1' file1 file2 > file3

$ cat file3
# comment here
90.0 355.0 2.09077