
일치하는 패턴과 함께 파일 이름을 인쇄하고 싶지만 파일에서 패턴 일치가 여러 번 발생하더라도 한 번만 인쇄하고 싶습니다.
예를 들어, 패턴 목록이 있습니다. 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.
나는 grep 명령 후에 파이프를 통해 sort가 이 작업을 수행할 수 있다는 것을 알고 있지만 grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
grep이 완료될 때만 수행됩니다. 현실 세계에는 list_of_patterns.txt
내 안에 수백 가지의 패턴이 있습니다. 때로는 작업을 완료하는 데 한 시간이 걸립니다.
이 프로세스 속도를 높이는 더 좋은 방법이 있습니까?
고쳐 쓰다:일부 파일에는 패턴이 100번 이상 일치했습니다. 예를 들어, /file4
이 패턴은 A
900번 발생합니다. grep
이것이 파일 이름과 함께 패턴 일치 항목이 모두 인쇄되기 때문에 완료하는 데 1시간이 걸리는 이유입니다 .
예를 들어 출력은 다음과 같습니다.
/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
이 프로세스 속도를 높이는 더 좋은 방법이 있습니까?
네, 그 이름은 GNU입니다parallel
:
parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
j N
- 직위 수.N
작업을 병렬로 실행합니다 .0
최대한 의미를 부여합니다.k
(--keep-order
) - 출력 순서를 입력 순서와 동일하게 유지::: arguments
arguments
- stdin(표준 입력) 대신 명령줄을 입력 소스로 사용