이 명령의 출력을 파일에 저장했다고 가정해 보겠습니다.
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
%