如何在 100 多个文件中查找重复字段

如何在 100 多个文件中查找重复字段

我有大约 120 个文件,每个文件都超过 1000 行

每行都有自己的密钥。这些列是 |分开

这是一个示例行,关键列(第 11 列始终为第 11 列)是:2010\07\05\ITE854075_RECardProtectionlogi.msg

错误:空,数据:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|国家未知

有没有办法找到所有具有匹配键/第 11 列值的行(整行不匹配)?我可以在命令行或脚本中执行此操作吗?我将使用 cygwin。

我什至不知道如何开始,所以即使您只愿意给我合适的命令来查找,我也会感激不尽。


每行都有自己的密钥,因此可能有与行一样多的密钥。

我只想让脚本在整个目录上运行并报告所有文件中的重复键,而无需任何其他用户输入。

定义键的是第 11 列。

答案1

假设“键”指的是“列”,您可以使用如下内容:

cut -f 11 -d "|" $(find . -type f -iname "*.txt") | sort | uniq -d | sed 's/\\/./g' | while read duplicate; do grep -rHn "|$duplicate|" * ; done

您可能必须将 的内容更改$(find -iname)为日志文件具有的任何扩展名(或者如果目录中唯一的文件是日志文件,则将其删除。这将递归地查找所有日志文件并匹配它们。

一些测试数据的输出如下所示:

test_data.txt:1:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data.txt:5:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data_2.txt:2:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data.txt:3:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data_2.txt:4:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known test_data.txt:7:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known

这些是文件中字段 11 重复的所有行。

该命令的作用的解释。

cut -f 11 -d "|"获取第 11 个字段(由 | 分隔)

find . -type f -iname "*.txt"考虑当前目录中以 .txt 结尾的任何文件(递归)

sort | uniq -d显示所有重复的“字段 11”

sed /\\/./g'这是一个 hack,因为\弄乱了 bash。我们将其替换为., grep 可以匹配任何字符。

while read duplicate; do grep -rHn "|$duplicate|" *; done- 迭代重复项列表并查找它们的所有出现,输出重复项出现的文件名和行号。

答案2

目前还不清楚你想做什么,但是,我会尝试一下:

首先,你的路线是什么?您将其作为一行给出:

Error: null, Data:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2011\07\05\ITE854075_RECardProtectionlogi.msg|Country not known

如果您的行看起来像这样,那么您的密钥位于字段 11 中

2011\07\05\ITE854075_RECardProtectionlogi.msg

但是,什么定义了你的密钥?难道只是在11场吗?

如果是这样,您可以在目标文件所在的目录中执行以下操作:

sort --field-separator='|' --key=11 <(\grep --recursive --line-number --color=always --with-filename '' *)

这将为您提供文件名的彩色输出,后跟该文件中的行号,然后是行本身,全部按关键字段 11 排序;因此,在输出中,任何文件中的所有匹配键都出现在彼此之上......

我认为这至少会给你一个线索


笔记:前面的反斜杠grep是为了防止出现任何grep别名。

相关内容