【问题标题】:merging two text files into one using batch or perl script使用批处理或 perl 脚本将两个文本文件合并为一个
【发布时间】:2013-10-19 09:47:03
【问题描述】:

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

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

在某些行之后,我可能会再次出现带有 # 符号的行,然后是 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

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

【问题讨论】:

  • 您在 Windows 或 Linux 中需要这个吗?

标签: perl shell batch-file


【解决方案1】:

尝试使用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

【讨论】:

  • 我在第三列中得到的答案不是其他两个文件中第三列的总和。例如文件 1 有 90.0 355.0 1.54 文件 2 有 90.0 355.0 0.550766 文件 3 我得到 90.0 355.0 3.08 这不是第 3 列中的总和
  • @user1016914 当我将 file1 和 file2 与您的示例输入相同并且第三行根据需要乘以 2 时,它对我有用。在这种情况下,您能否使用 file2 的内容更新您的问题,以便我可以对其进行测试并在最后告诉您输出?
  • @user1016914 这里假设你的两行都匹配,不同的行号没有任何差异。我将更新 ans 以消除该限制。
  • 不,我们要添加两个文件的第 3 列,结果应该在新文件的第 3 列中。不需要乘法。其他一切都很完美。
  • @user1016914 我已经更新了ans。请立即检查。我没有倍增。当我说乘以 2 时,意味着添加了 file1 和 file2 的相同数据,因为我没有 file2 的 I 数据,并且将 file2 也作为 file1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多