【发布时间】:2018-02-20 18:24:52
【问题描述】:
我提前道歉 - 我不确定是否有一个仅使用 Linux 命令行 fu 的答案。请注意,我不是程序员,但过去几年我一直在玩 bash 和 python。
我有一个大文本文件,其中的行和列类似于以下内容(注意 - 字段用制表符分隔):
1074 Beetle OOB11061MNH 12/22/16 Confirmed
3430 Hightop 0817BESTYET 08/07/17 Queued
3431 Hightop 0817BESTYET 08/07/17 Queued
3078 Copland 2017GENERAL 07/07/17 Confirmed
3890 Bartok FOODS 09/11/17 Confirmed
5440 Alphapha 00B1106IMNH 01/09/18 Queued
我想要做的是仅查找并输出列表中第三个字段与另一个字段相同或相似的那些行。我真的不在乎其他字段是否相似,但它们都应该包含在输出中。类似,我的意思是在该特定字段中不超过 [n] 个字符不同(例如,不超过 3 个字符不同)。所以我想要的输出是:
1074 Beetle OOB11061MNH 12/22/16 Confirmed
3430 Hightop 0817BESTYET 08/07/17 Queued
3431 Hightop 0817BESTYET 08/07/17 Queued
5440 Alphapha 00B1106IMNH 01/09/18 Queued
以 1074 开头的行有一个与 5440 相差 3 个字符的第三个字段,因此它们都包括在内。包括 3430 和 3431 是因为它们完全相同。 3078 和 3890 被淘汰,因为它们不相似。
通过谷歌搜索论坛,我设法拼凑出这个相当长的管道,以便能够找到字段 3 完全相同的所有实例:
cat inputfile.txt | awk 'BEGIN { OFS=FS="\t" } {if (count[$3] > 1) print $0; else if (count[$3] == 1) { print save[$3]; print $0; } else save[$3] = $0; count[$3]++; }' > outputfile.txt
我必须承认我不太了解 awk。我只是从网络上复制和改编。但这似乎非常适合查找精确的重复项(即,它只会在上面输出 3430 和 3431)。但我不知道如何尝试找到不相同但在不超过 3 个地方不同的字符串。
例如,在我上面的示例中,它应该匹配 1074 和 5440,因为它们都符合模式: ??B1106?MNH
但我希望它也能够匹配任何其他随机匹配模式,只要不超过三个差异,如下所示: 20?7G?N?RAL
这些差异可以任意出现在任何位置。
需要这个的原因是我们试图找到一种方法来自动查找类似序列号的字段中的印刷错误。可能有误键,或者字母“O”替换为数字“0”等。
那么...有什么想法吗?感谢您的帮助!
【问题讨论】:
-
这个文件有多少行?
-
成千上万。此时,大约有 6500 行。