이메일 주소에서 도메인 이름을 추출하여 파이프로 구분된 파일의 새 열에 추가하려면 어떻게 해야 합니까?

이메일 주소에서 도메인 이름을 추출하여 파이프로 구분된 파일의 새 열에 추가하려면 어떻게 해야 합니까?

세 번째 열에 이메일 주소가 포함된 파이프로 구분된 파일이 있습니다. 세 번째 열에 있는 이메일 주소의 도메인 이름에서 네 번째 열을 생성하려면 awk 또는 sed 명령을 사용하는 데 도움이 필요합니다.

입력 파일

TEST|1234|[email protected]
TEST|4533|[email protected]
TEST|9030|[email protected]
TEST|0903|[email protected]

예상 출력

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

답변1

이 시도,

awk -F '@' '{print $0"|"$NF}' file

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

답변2

사용 sed:

$ sed 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

이는 @각 줄의 첫 번째 문자와 일치하고 캡처 그룹을 사용하여 그 이후의 모든 것을 캡처합니다. 일치하는 텍스트는 그 자체로 대체되고, 캡처된 텍스트가 |그 사이에 한 문자씩 대체됩니다.

파일이 DOS 텍스트 파일인 경우(일부 설명에서 알 수 있듯이) 동일한 명령을 사용하여 이를 Unix 텍스트 파일로 변환할 수 있습니다.

$ sed -e 's/[[:cntrl:]]$//' -e 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

두 번째 교체는 이전과 동일하지만 첫 번째 교체는 줄 끝에 있는 모든 제어 문자를 제거합니다(이렇게 하면 각 줄 끝에 캐리지 리턴 문자가 있는 경우 제거됩니다). 원본 파일이 DOS인지 Unix 텍스트 파일인지에 관계없이 마지막 명령의 출력은 Unix 텍스트 문서가 됩니다.

답변3

아래 스크립트를 사용해 보세요

for i in `cat o.txt`; do y=`echo $i |awk -F "|" '{print $NF}'| awk -F "@" '{print $NF}'`; echo $i | awk -v y="$y"  '{print $0"|"y}'; done

산출

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

관련 정보