awk/sed를 사용하여 일부 이메일 주소를 뒤집으시겠습니까?

awk/sed를 사용하여 일부 이메일 주소를 뒤집으시겠습니까?

먼저 도메인별로 정렬하고 싶은 이메일 주소의 긴 목록이 있으므로 다음과 같은 행을 선택하고 싶습니다.

email: [email protected]
email: [email protected]

그리고 이것을 얻었습니다 :

ru.yandex email: [email protected]
com.changeip.josephay905s email: [email protected]

어떻게 해야 하나요?

다음은 더 큰 데이터 세트입니다.

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

답변1

노력하다:

awk -F'@' '
{ split($2, flip, "."); 
  for (i=length(flip); i>=1; i--) printf flip[i] (i!=1?".":" "); 
  print $0;
}' infile
  • @필드 구분자로 정의됨-F'@'
  • 점 구분 기호의 두 번째 필드를 .다음과 같은 배열로 분할합니다.flip
  • 배열의 요소를 마지막부터 첫 번째까지 반복하고 각 요소를 인쇄한 다음 .(첫 번째 요소 제외) 전체 행을 인쇄합니다 $0.

참고: awkarray_length는 지원되지 않습니다(참조AWK - 배열의 스토리지 또는 인덱스를 계산하는 방법), 다음 접근 방식을 시도해 보십시오. 먼저 배열이 사용하는 요소 수를 찾아 for 루프에서 최대값으로 사용하는 것입니다. 예를 들면 다음과 같습니다.

awk -F'@' '
{ split($2, flip, ".");
  max=i=0; for (elements in flip) max++;
  for (i=max; i>=1; i--) printf flip[i] (i!=1?".":" ");
  print $0;
}' infile

답변2

한 줄로 하려고 한다면 이 펄을 사용하면 됩니다. 기본적으로 -F 플래그는 awk와 동일하므로 각 줄을 문자로 나눕니다 @. 패드의 첫 번째 부분은 $s도메인의 반전된 부분을 갖는 name이라는 변수를 생성합니다. 한 줄의 두 번째 부분은 역방향 도메인을 인쇄한 다음 $_변수에 저장된 원래 입력을 인쇄합니다.

perl -F'@ ' -lane '$s = join ".", reverse split/\./, $F[-1]; print "$s $_"'

답변3

#sed -r -n 's/^([^@]+@)(.+)\.([a-z]{2,3})[\r\n\t ]{0,}$/\3.\2 \1\2.\3/gip'  <<< "email: [email protected]"

또는

#sed -r -n 's/^([^@]+@)(.+)\.([a-z]{2,3})[\r\n\t ]{0,}$/\3.\2 \1\2.\3/gip'  ./your file

업데이트: 세 번째 도메인을 지원하도록 수정되었습니다.

sed -r -n 's/^([^@]+@)([^\.]+)(\.[^\.]+){0,1}\.([a-z]{2,3})[\r\n\t ]{0,}$/\4\3.\2 \1\2\3.\4/gip'  <<< "email: [email protected]"
result: ru.yandex email: [email protected]

그리고

sed -r -n 's/^([^@]+@)([^\.]+)(\.[^\.]+){0,1}\.([a-z]{2,3})[\r\n\t ]{0,}$/\4\3.\2 \1\2\3.\4/gip'  <<< "email: [email protected]"
result: com.changeip.josephay905s email: [email protected]

@TERDON 귀하의 의견에 감사드립니다.

답변4

귀하의 요청을 직접 이행했습니다."첫 번째 도메인별 정렬", 단순히 각 행의 시작 부분에 추가 열을 만드는 대신 행별로 정렬할 준비를 합니다.

sort -t@ -k2,3 -k1,2 file

"대규모 데이터 세트"의 출력

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

도메인 구성 요소를 "가장 중요"에서 "가장 중요하지 않음"으로 그룹화하려는 설명에서 변경된 요구 사항을 해결하려면 다음을 시도하십시오.

rev file | sort | rev

"더 큰 데이터 세트"에 대한 출력 수정

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

관련 정보