【发布时间】:2018-03-25 20:49:04
【问题描述】:
几年来,我经常需要将(排序的)文本行与匹配的第一个字段组合起来,但我从未找到一种优雅的(即单行 unix 命令行)方法来做到这一点。我想要的类似于 unix join 命令可能实现的功能,但 join 需要 2 个文件,每个键最多出现一次。我想从一个文件开始,其中一个键可能出现多个图块。
我有一个 ruby 和 perl 脚本来执行此操作,但没有办法将我的算法缩短为单行。经过多年的 unix 使用,我仍在学习 comm、paste、uniq 等新技巧,我怀疑有一种聪明的方法可以做到这一点。
有一些相关的问题,比如join all lines that have the same first column to the same line; Command line to match lines with matching first field (sed, awk, etc.);和Combine lines with matching keys——但这些解决方案从来没有真正提供干净可靠的解决方案。
这里是示例输入:
apple:A fruit
apple:Type of: pie
banana:tropical fruit
cherry:small burgundy fruit
cherry:1 for me to eat
cherry:bright red
这是示例输出:
apple:A fruit;Type of: pie
banana:tropical fruit
cherry:small burgundy fruit;1 for me to eat;bright red
这是我理想的语法:
merge --inputDelimiter=":" --outputDelimiter=";" --matchfield=1 infile.txt
“匹配字段”实际上是可选的。它可能永远是第一个领域。分隔符的后续出现应视为纯文本。
如果您能想到一个简短而优雅的算法,我不介意 perl、ruby、awk 单行。这应该能够处理数百万行输入。有任何想法吗?
【问题讨论】:
标签: unix join awk command-line bsd