![1개의 파일 이름과 일치하는 패턴만 인쇄하려면 어떻게 해야 합니까?](https://linux55.com/image/127667/1%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%ED%8C%A8%ED%84%B4%EB%A7%8C%20%EC%9D%B8%EC%87%84%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
일치하는 패턴과 함께 파일 이름을 인쇄하고 싶지만 파일에서 패턴 일치가 여러 번 발생하더라도 한 번만 인쇄하고 싶습니다.
예를 들어, 패턴 목록이 있습니다. 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(표준 입력) 대신 명령줄을 입력 소스로 사용