【问题标题】:script,unix,compare脚本,unix,比较
【发布时间】:2010-12-06 06:34:42
【问题描述】:

我有两个文件...

文件1:

002009092312291100098420090922111
010555101070002956200453T+00001190.81+00001295.920010.87P
010555101070002956200449J+00003128.85+00003693.90+00003128
010555101070002956200176H+00000281.14+00000300.32+00000281

文件2:

002009092410521000098420090709111
010560458520002547500432M+00001822.88+00001592.96+00001822
010560458520002547500432D+00000106.68+00000114.77+00000106

在每条01开头的记录的两个文件中,从第3个字符到第25个字符的字符串,即到字母表是关键。

根据这个key,我要比较两个文件,如果文件2中有匹配的记录,那么我必须替换file1中的记录,如果不匹配就追加它。

【问题讨论】:

  • 第 3 到第 25 个字符“字符串”似乎在日期中间结束......或者是这样吗?我认为您应该更清楚地描述文件的格式。我不知道其他人,但你的“问题”末尾的“尽快”让我很反感。
  • 我投票结束这个“需要细节或清晰”,因为我认为它没有任何长期价值。

标签: unix scripting sed awk compare


【解决方案1】:

嗯,这是一个相当不具体(和基本)的编程问题。如果您准确地解释您做了什么以及您遇到困难的地方,我们将能够更好地帮助我们。

而且,它看起来有点像家庭作业,人们担心在家庭作业问题上提供太多帮助,因为它可能看起来像作弊。

让您开始:

  • 我推荐Perl 来解决这个问题,但awk 或其他脚本语言也可以。我建议不要使用 sh/bash,因为它们在文本操作方面很弱;同样结合 grep 等会变得相当麻烦。
  • 首先编写一个 Perl 程序,过滤以 01 开头的记录。然后提取键并将其放入哈希(Perl 结构)中。然后根据需要输出一个新的组合文件。

【讨论】:

    【解决方案2】:

    使用 awk 从 3-25 获取字段,但执行类似的操作 awk -F "" '/^01/{print $1}' file_name | cut -c 3-25 并将前两个字段与两个文件中的 01 匹配,并获取两个不同缓冲区中的所有行,并在 shell 脚本中使用 for line in 比较两个缓冲区。

    每当第二个缓冲区中的行与第一个匹配时,grep 第一个文件中第二个缓冲区中的行并将第一个文件中的行替换为第二个中的行。我认为您需要围绕逻辑进行一些工作。

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 2020-12-10
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多