나머지 줄을 무시하면서 grep 패턴 일치에서 고유한 줄을 출력하는 방법은 무엇입니까?

나머지 줄을 무시하면서 grep 패턴 일치에서 고유한 줄을 출력하는 방법은 무엇입니까?

names.txt다음 형식의 사람 이름과 해당 이메일 목록이 포함된 파일이 있다고 가정해 보겠습니다 .

FName1 LName1 <[email protected]>
FName2 LName2 <[email protected]>
FName3 LName3 <[email protected]>
FName4 <[email protected]>
FName5 MName1 LName4 <[email protected]>
FName1 LName1 <[email protected]>
...

내가 달성하고 싶은 것은 이름(예: 이메일 무시)을 기준으로 모든 고유한 사람을 대소문자를 구분하지 않고 출력하는 것입니다 names.txt. 따라서 출력은 다음과 같습니다.

FName1 LName1
FName2 LName2 
FName3 LName3 
FName4 
FName5 MName1 LName4  

동일한 이름이 파일에 여러 번 나타날 수 있으며 이름은 소문자, 대문자, 숫자 등이 혼합될 수 있습니다. 가능한 이름의 예는 "JoHn sMitH JOnes", "StEve" 또는 "RoB3rt Fro5t"입니다.

제가 고민하는 것은 이메일을 연결하지 않고 고유한 이름만 출력하는 방법입니다. grep다음 명령을 사용하여 출력하려는 ​​패턴을 일치시킬 수 있습니다.

grep -i "^[A-Za-z0-9]*[ ]*[A-Za-z0-9]*[ ]*[A-Za-z0-9]*" names.txt

그러나 이러한 패턴 결과를 어떻게 사용하고 각 줄의 이메일 부분을 생략하면서 고유한 이름을 출력하는지 잘 모르겠습니다. 이 grep결과를 사용하여 다른 명령에 표준 입력으로 보낼 수 있는 방법이 있습니까 ? 어떤 피드백이나 제안이라도 대단히 감사하겠습니다.

답변1

그리고 awk:

awk '
  {
    sub(/<.*/, "") # remove email address
    $1 = $1 # remove leading and trailing blanks, squeeze all sequences of blanks
            # into one space
    if (!seen[tolower($0)]++) print # print if not seen before
  }' < names.txt

답변2

다른 방법으로도 할 수 있습니다. 이메일 무시:

cut -d'<' -f1 names.txt | sort -fu

이렇게 하면 구분 기호에서 행을 잘라내고 <첫 번째 필드를 인쇄하고 정렬한 -f다음(대소문자 무시) 대소문자만 다른 이름만 유지합니다(대소문자 무시 -u).

관련 정보