我有两个文件 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
如何实现这个目标?
这可能对你有用(GNU sed):
从 fileA 构建 sed 脚本以应用于 fileB。
fileA 中的每一行都被转换为匹配和替换。索引用作匹配,其描述用于替换,然后应用于 fileB。匹配的行将具有 fileA 中的描述。
注意:在两个替换命令中使用备用分隔符。如果描述可能包含该
#
字符,则使用任何描述中都不存在的另一个字符作为分隔符。TXR Lisp中的解决方案:
代码:
或者,使用
awk
宏来扫描文件;但除此之外同样的方法:使用任何 awk:
即使您的任何“描述”包含空格,上述内容也将起作用,例如给出以下输入:
我们仍然得到所需的输出: