1개의 파일 이름과 일치하는 패턴만 인쇄하려면 어떻게 해야 합니까?

1개의 파일 이름과 일치하는 패턴만 인쇄하려면 어떻게 해야 합니까?

일치하는 패턴과 함께 파일 이름을 인쇄하고 싶지만 파일에서 패턴 일치가 여러 번 발생하더라도 한 번만 인쇄하고 싶습니다.

예를 들어, 패턴 목록이 있습니다. 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 -ugrep이 완료될 때만 수행됩니다. 현실 세계에는 list_of_patterns.txt내 안에 수백 가지의 패턴이 있습니다. 때로는 작업을 완료하는 데 한 시간이 걸립니다.

이 프로세스 속도를 높이는 더 좋은 방법이 있습니까?

고쳐 쓰다:일부 파일에는 패턴이 100번 이상 일치했습니다. 예를 들어, /file4이 패턴은 A900번 발생합니다. 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) - 출력 순서를 입력 순서와 동일하게 유지
  • ::: argumentsarguments- stdin(표준 입력) 대신 명령줄을 입력 소스로 사용

관련 정보