【问题标题】:Compare two files and replace value in one of the file比较两个文件并替换其中一个文件中的值
【发布时间】:2020-01-11 08:02:58
【问题描述】:

我必须归档。 AU.swo比较 文件。
AU.swo 包含数据:

7844204020353125700125759G19
7855207010004191300200759119
7898211030001191500193359119
7898211030001212800212959G19
7898211030002212600212759G19

比较包含数据:

7844204G1
785520712
7898211G1
789821112

文件的前七个值是 ID 号,比较文件中的位置 8 与 AU.swo 中的位置 26 相同。我想要做的是从 AU.swo 文件中的最后一个位置替换数字 9 。它应该看起来像:

7844204020353125700125759G11
7855207010004191300200759112
7898211030001191500193359112
7898211030001212800212959G11
7898211030002212600212759G11

什么更好用? awk 还是 sed 命令?你能给我一些提示我该怎么做吗? 谢谢

【问题讨论】:

    标签: bash awk replace compare


    【解决方案1】:

    (编辑:python 中另一个更好的解决方案:)

    python -c 'for l in zip(open("AU.swo"), open("Compare")): print(l[0][:-2] + l[1][-2:-1])'

    这个也不会附加在输入字符串的确切长度上。

    我原来的解决方案,虽然很丑:

    paste -d '' <(sed 's/\(.*\).$/\1/' AU.swo) <(cut -c 9- Compare)

    这是如何工作的:

    sed 's/\(.*\).$/\1/' AU.swo 打印从AU.swo 开始的每一行,没有最后一个字符。我们用<( ... ) 包围它,将其用作paste 的第一个输入。

    cut -c 9- Compare 仅打印Compare 中每一行的最后一个字符。请注意,这假设每行正好是 9 个字符。

    paste -d '' 获取两个输入的每一行并将它们一起打印在一行上。

    请注意,我在 linux 和 mac OS 上对此进行了测试,这可能无法正常工作。

    【讨论】:

      【解决方案2】:

      你可以使用这个awk:

      awk 'NR == FNR {
         k[substr($0, 1, 7),substr($0, 8, 1)] = substr($0, 9, 1)
         next
      }
      (substr($0, 1, 7), substr($0, 26, 1)) in k {
         sub(/9$/, k[substr($0, 1, 7),substr($0, 26, 1)])
      } 1' compare AU.swo
      

      7844204020353125700125759G11
      7855207010004191300200759112
      7898211030001191500193359112
      7898211030001212800212959G11
      7898211030002212600212759G11
      

      【讨论】:

      • 它在 2 个不同版本的 awk 上经过了适当的测试和工作代码。检查输入文件中的 DOS 行结尾。
      • 是的,你有权利。这是 DOS 行尾。我对 AU.swo 文件使用了 dos2unix 命令,现在它可以正常工作了。感谢您的帮助
      • 如果我想从另一个位置替换值 9,而不是从末尾替换。例如位置 25 中的值为 9。我试图使用 sub(substr($0,25,1)==9, k[substr($0, 1, 7),substr($0, 26, 1)]) 但它无法正常工作
      • @Matej:使用awk 'NR == FNR{k[substr($0, 1, 7),substr($0, 8, 1)] = substr($0, 9, 1); next} (substr($0, 1, 7), substr($0, 26, 1)) in k {$0 = substr($0,1,24) k[substr($0, 1, 7),substr($0, 26, 1)] substr($0,26)} 1' compare AU.swo
      • 比较文件的返回值。
      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多