다음 텍스트가 포함된 파일이 있다고 가정해 보겠습니다.
- 번호 1
- 번호_3
- 번호 1
- 번호_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+$
. 그런 다음 일치하는 각 행의 첫 번째 고유 인스턴스만 유지하면서 모든 중복 일치 항목을 제거합니다.