计算多个文件中唯一出现的次数

计算多个文件中唯一出现的次数

我有多个日志文件,我需要计算其中包含“唯一 ID”的特定行的出现次数。

所以日志行看起来像

<Some_ID> is related to <Unique_ID>

并且上述值可以在日志中重复任意次,

我需要找到一个命令来计算多个文件中上述日志行(具有不同 ID)的唯一出现次数。

答案1

此命令将删除唯一 ID 之前的所有文本,然后统计唯一 ID 出现的次数并生成一个列表,按出现的升序排序:

cat log1 log2 ... logN | sed 's/^.* is related to //' | sort | uniq -c | sort -n

答案2

如果“Some_ID”和“Unique_ID”之间的文本确实是常量,那么以下内容应该有效(换句话说,例如,没有时间戳):

cat log1 log2 ... | grep "Some_ID" | sort | uniq -c | sort -n

答案3

如果我理解正确的话,你想获取 ID,我们可以使用 来完成此操作,并将它们插入到和 的sedwhile 循环中。grepwc

cat files | sed -e 's/.*is related to //g' \
| while IFS= read -r ID; do
    count=`grep $ID files | wc -l`
    echo "$ID = $count"
done

答案4

从您的问题和评论中的澄清来看,我理解您的问题的方式是您正在寻找独特关系的数量。因此,如果给定一个文件如下:

345 is related to 123
678 is related to 123
187 is related to 732
678 is related to 123

结果应该是 3。要执行此操作,sortuniqcatwc和管道操作符将成为您的朋友。

如果您要搜索的所有文件都在一个文件夹中,您可以简单地使用*(a通配符运算符)来搜索每个文件。例如,cat *将打印当前目录中每个文件的内容。您还可以通过列出多个文件来指定它们。cat file1.txt file2.txt将打印file1file2。这可以与通配符结合使用来指定特定子目录中的文件:(cat dir1/* dir3/*跳过dir2/)。您还可以指定部分文件名:cat file*将匹配file1andfile123但不匹配afile

使用上面的内容,您可以包括任何您想要输入的文件sort。管道运算符 ( |) 获取一个命令的输出并将其通过管道输送到另一命令的输入中。cat file1 | sort将对 的内容进行排序file1。然后,您可以将其通过管道传输uniq以过滤掉所有重复的条目,然后使用wc如下方式对行进行计数:cat file1 | sort | uniq | wc -l

使用我上面给出的示例文件,该sort命令会将输出更改为:

187 is related to 732
345 is related to 123
678 is related to 123
678 is related to 123

uniq将删除重复的条目(在此示例中位于底部):

187 is related to 732
345 is related to 123
678 is related to 123

wc -l计算行数并返回3

笔记:这个会算 123 is related to 321 321 is related to 123 作为分开的关系。如果你想解决这个问题,你将需要做一些更复杂的事情,包括解析输入数据并将条目组织到表或哈希图中。

此外,在非常大的输入上,该命令链可能会挂起并且看起来好像已经冻结了。如果您使用大量输入数据,我会考虑设置一个数据库来管理数据,因为这将允许您使用查询更快地执行此类搜索。

相关内容