将一个文件中每一行的后半部分替换为另一个文件中相应行的后半部分

问题描述 投票:0回答:1

我有两个文件 A 和 B。两个文件中的每一行都被视为一个项目。每个项目的格式都是固定的,由键和描述组成,并用空格分隔。如下例所示。

UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark

第一部分

UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104
是关键,最后一部分
/users/documents/ark
是描述。文件 A 和 B 分别有 1000 和 100000 个项目。在我们的示例中,每个键都可以分为两部分:索引(例如:
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2
)和时间戳(例如:
0000027_0000104
)。时间戳中的数字没有任何规则。索引和时间戳之间的字符固定为
_
。每个键都是唯一的,每个索引在同一个文件中也是唯一的。文件 A 中包含的每个索引也出现在文件 B 中,并且具有不同的时间戳。如下一个简单的例子所示。

文件A

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark2

文件B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark3
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark4
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

我想将文件B中相同索引对应的描述替换为文件A中索引对应的描述。示例中的结果如下所示。

文件B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

如何实现这个目标?

awk sed grep
1个回答
0
投票

TXRLisp 中的解决方案:

$ txr subst.tl filea fileb
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

代码:

(tree-bind (filea fileb) *args*
  (let ((h (hash)))
    (with-stream (s (open-file filea))
      (whilet ((line (get-line s)))
        (match `@a-@{b}_@{c}_@d @path` line
          (set [h `@a-@b-@c`] path))))
    (with-stream (s (open-file fileb))
      (whilet ((line (get-line s)))
        (match `@a-@{b}_@{c}_@d @path` line
          (put-line `@a-@{b}_@{c}_@d @(or [h `@a-@b-@c`] path)`))))))
© www.soinside.com 2019 - 2024. All rights reserved.