我想将文件名与匹配模式一起打印,但即使模式匹配在文件中多次出现,也仅打印一次。
例如,我有一个模式列表;list_of_patterns.txt
我需要查找文件的目录是/path/to/files/*
.
模式列表.txt:
A
B
C
D
E
/路径/到/文件/
/file1
/file2
/file3
假设/file1
该模式A
多次出现,如下所示:
/文件1:
A
4234234
A
435435435
353535
A
(对于存在多个模式匹配的其他文件也同样如此。)
我运行了这个 grep 命令,但每次模式匹配时它都会打印文件名。
grep -Hof list_of_patterns.txt /path/to/files/*
输出:
/file1:A
/file1:A
/file1:A
/file2:B
/file2:B
/file3:C
/file3:B
... and so on.
我知道 sort 可以在 grep 命令之后通过管道执行此操作,grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
但它仅在 grep 完成时执行。在现实世界中,我的list_of_patterns.txt
内部有数百种模式。有时需要一个小时才能完成任务。
有没有更好的方法来加速这个过程?
更新:有些文件有超过一百次的匹配模式。例如,/file4
该模式出现了A
900 次。这就是为什么需要grep
一个小时才能完成的原因,因为它会将每次出现的模式匹配与文件名一起打印。
例如输出:
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
... and so on til' it reach 900 occurrences.
我只想让它打印一次。
例如期望的输出:
/file4:A
/file1:A
/file2:B
/file3:A
/file4:B
答案1
有没有更好的方法来加速这个过程?
是的,它的名字叫 GNUparallel
:
parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
j N
- 职位数量。并行运行N
作业。0
意思是尽可能多。k
(--keep-order
) - 保持输出顺序与输入顺序相同::: arguments
- 使用arguments
命令行作为输入源而不是 stdin(标准输入)