我有两个文件 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
如何实现这个目标?
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)`))))))