목록에서 문자의 첫 번째 인스턴스를 반환합니다.

목록에서 문자의 첫 번째 인스턴스를 반환합니다.

이 명령의 출력을 파일에 저장했다고 가정해 보겠습니다.

cat /dev/urandom | tr -dc '[:graph:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 50

파일에 있는 각 줄의 처음 n 문자만 비교하고 이러한 문자의 첫 번째 인스턴스가 포함된 첫 번째 줄만 반환하고 싶습니다.

예를 들어, 파일을 정렬하지 않고 파일의 각 줄의 처음 4개 문자를 보고 싶습니다. 각 줄에서 네 개의 문자열 중 첫 번째 인스턴스를 찾고 첫 번째 인스턴스가 포함된 줄만 인쇄하고 싶습니다.

각 줄에 4, 5, 6개의 문자가 표시되도록 명령을 수정할 수 있다면 감사하겠습니다.

귀하의 시간과 도움에 진심으로 감사드립니다. 나는 정말로 이것을 알아 내려고 노력해 왔습니다.

  • MelBurslan, 문자열의 내용은 관련이 없어야 하지만 위 명령의 출력(현재 수정됨)은 영어 키보드에 입력할 수 있는 모든 문자입니다. 다음은 두 가지 예시 라인입니다.

    k!>d#&)"EtXN`;*9TaD7BcL84z5[y{$Q?_Y%fCw6F0Vgn\|]ImqR.:1l<^}u'+Ms/hjS@e~2vxWO(3,bJiprP-=UAZGoHK
    3'O$#Eg5&,`l>vn491M"cVZR\7J.H[XTw*:q}Kz8hf;W_P|i<6@CAytF^Dmkb]GBsU+{Y?xje%oIQ-~r!2Sap=/)N0du(L
    
  • Glenn, 네, 네 개의 문자열/키/토큰의 첫 번째 인스턴스입니다. 또한 필요에 따라 문자 일치를 조작할 수 있도록 일치가 변경 가능해야 합니다.

  • 와일드카드, 잘 작동합니다. 감사합니다.

  • thrig, 아주 잘 작동합니다. 감사합니다.

답변1

가설귀하의 질문에 대한 Glenn Jackman의 설명awk맞습니다. 다음을 사용하는 솔루션은 다음과 같습니다 substr().

awk '{key = substr($0,1,4)}; !(key in printed); {printed[key]}' file

이는 "key"를 줄의 처음 4개 문자로 설정한 다음 이전에 키를 본 적이 없는 한 줄을 인쇄하고 키가 인쇄되었다는 사실을 추적합니다.

답변2

해싱을 사용하시겠습니까?

% (echo foo; echo bar; echo foobar) \
  | perl -ne '/(.{3})/; print unless $seen{$1}++'
foo
bar
% 

관련 정보