1

我必须归档。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 命令?你能给我一些提示我该怎么做吗?谢谢

4

2 回答 2

1

你可以使用这个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
于 2019-09-09T14:47:47.113 回答
0

(编辑: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.swoAU.swo打印没有最后一个字符的每一行。我们将其包围<( ... )以将其用作 的第一个输入paste

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

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

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

于 2019-09-09T14:36:55.207 回答