여러 번 달리는 주자의 이름을 인쇄하려는 마라톤 파일이 있습니다. 그것은 다음과 같습니다:
M, 2:08:58.0, John Lukas, USA, 1997-07-25, Paris, France
F, 2:15:04:0, Abebbe Boukari, KEN, 2000-10-01, London, UK
등.
uniq를 시도했지만 발생하지 않았습니다.
uniq -d marathon | grep "[[:alpha:]]\+[ ]\+[[:alpha:]]"
답변1
먼저 이름순으로 정렬해야 합니다.
참고: "uniq"는 인접하지 않는 한 중복 행을 감지하지 않습니다. 입력을 먼저 정렬하거나 "uniq" 없이 "sort -u"를 사용할 수 있습니다.
-t/-k
다음 옵션을 사용하여 이러한 필드를 정렬 할 수 있습니다 .
sort -t',' -k 3 marathon
쉼표를 구분 기호로 사용하여 세 번째 필드를 정렬합니다.
그런 다음 awk를 사용하여 세 번째 열만 인쇄한 후 다음 명령을 사용할 수 있습니다 uniq
.
sort -t',' -k 3 marathon | awk -F, '{print $3}'|uniq -d
/!\ 검증되지 않은
모든 행을 유지하려면 awk를 사용하여 이름의 발생 횟수를 저장할 수 있습니다( count[$3]++
). 이름의 모든 행을 유지합니다( lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;
: 첫 번째 행인 경우 행을 저장하고 그렇지 않으면 추가). 마지막으로 count ≥ 2이면 if(count[i]>1){ print lines[i]}
name()을 사용하여 행을 인쇄합니다.
sort -t',' -k 3 marathon | awk -F, '{count[$3]++;lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;}END{for (i in count){if(count[i]>1){ print lines[i]}}}'
답변2
또 다른 간단한 대안(알고 싶지 않거나 모르는 사람들을 위한 awk
) 스크립트는 다음과 같습니다.
#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d
누구든지 대신 전체 줄을 인쇄하고 싶다면오직이름:
#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d | grep -f - marathon
위 스크립트에서:
sort
,
옵션의 구분 기호로 사용되는 세 번째 필드와 옵션-t
의 세 번째 필드를 기준으로 정렬-k
cut
,
이 명령은 구분 기호를 사용하여 세 번째 필드를 잘라냅니다.-d
반복되는 줄만 인쇄하는 옵션uniq
, 이는 정확히 질문 작성자가 원했던 것입니다 - "반복 패턴 인쇄"-f
파이프에서 입력(예: 이름)을 가져와 마라톤 파일에서 검색하여 이름 대신 전체 줄을 제공하는 옵션