반복 패턴 인쇄

반복 패턴 인쇄

여러 번 달리는 주자의 이름을 인쇄하려는 마라톤 파일이 있습니다. 그것은 다음과 같습니다:

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파이프에서 입력(예: 이름)을 가져와 마라톤 파일에서 검색하여 이름 대신 전체 줄을 제공하는 옵션

관련 정보