我有大约 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
别名。