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
).