정규식에서 고유한 일치 항목만 인쇄하는 방법은 무엇입니까?

정규식에서 고유한 일치 항목만 인쇄하는 방법은 무엇입니까?

다음 텍스트가 포함된 파일이 있다고 가정해 보겠습니다.

  1. 번호 1
  2. 번호_3
  3. 번호 1
  4. 번호_4

정규식을 사용하여 각 상황에 대해 한 번만 인쇄하는 방법번호_n? 사용:

grep -oE "Number_\w+" 

모든 일치 항목을 반환합니다.

번호 1

번호_3

번호 1

번호_4

그러나 나는 다음과 같은 결과를 원합니다.

번호 1

번호_3

번호_4

답변1

grep -oE "Number_\w+"  | sort -u

답변2

(아, 그런데 편집자가 질문을 살짝 바꿨네요.)

각 출력 행의 복사본 하나만 인쇄하는 쉬운 방법은 파이프 sort -u(또는 sort | uniq)를 사용하는 것입니다. 물론 이렇게 하면 출력이 정렬됩니다.

기타 관련 솔루션은 다음과 같습니다.고유한 라인 인쇄


(원래 이 질문에 대한 답은 다음과 같았습니다.)

정규식과 일치하는 첫 번째 문자열만 인쇄하려면 다음을 사용할 수 있습니다 grep -m1 ....

-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

일치하는 항목이 다른 줄에 있으면 직접 작동하지만 같은 줄에 일치하는 문자열이 여러 개 있으면 -o모두 인쇄되므로 다음과 같은 것을 추가하세요 | head -1.

답변3

$ awk '{print $NF}' file | sort -u
Number_1
Number_3
Number_4

$ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file
Number_3
Number_4
Number_1

답변4

사용 jq:

$ cat file
Number_1

Number_3

Number_1

Number_4
$ jq -n -R -r '[inputs | select(test("^Number_\\d+$"))] | unique[]' file
Number_1
Number_3
Number_4

또는 명령줄에 제공된 정규식을 사용하세요.

$ jq -r -R -n --arg re '^Number_\d+$' '[inputs | select(test($re))] | unique[]' file
Number_1
Number_3
Number_4

이는 PCRE 정규식과 일치하는 행을 선택합니다 ^Number_\d+$. 그런 다음 일치하는 각 행의 첫 번째 고유 인스턴스만 유지하면서 모든 중복 일치 항목을 제거합니다.

관련 정보