스크립트에서 별도의 runon 텍스트

스크립트에서 별도의 runon 텍스트

다음과 같은 CSV 입력이 있습니다.

XiaoLi,6705462234,[email protected],NC764
NatkinPook,8044344528,[email protected],VA22345
EliziMoe,5208534566,[email protected],AZ85282
MaTa,4345667345,[email protected],TX91030
DianaCheng,5203456789,[email protected],WY4587
JacksonFive,5206564573,[email protected],AZ85483
AdiSrikanthReddy,6578904566,[email protected],WS67854

다음을 출력하고 싶습니다.

Xiao Li 6705462234 [email protected] NC 764
Natkin Pook 8044344528 [email protected] VA 22345
Elizi Moe 5208534566 [email protected] AZ 85282
Ma Ta 4345667345 [email protected] TX 91030
Diana Cheng 5203456789 [email protected] WY 4587
Jackson Five 5206564573 [email protected] AZ 85483
Adi SrikanthReddy 6578904566 [email protected] WS 67854

( FirstName LastName PhoneNumber UserID@Email State Zip)

이것이 내가 지금까지 가지고 있는 것입니다

 awk -F "," ' {print $1, $4, $3, $6}' data3

이름과 성을 서로 구분할 수 없고, 주와 우편번호도 함께 실행됩니다. 이 두 가지 상황을 어떻게 구별할 수 있나요?

awk를 사용하고 싶은데 [AZ]와 같이 대문자를 구분하는 방법이 있나요?

답변1

Steeldriver 사용자의 답변이 승인된 것을 확인했지만 더 짧고 간단하며 읽기 쉬운 옵션을 제공하고 싶었습니다. 적어도 awk의 다른 기능 중 일부를 보여줍니다(OP는 항상 마음을 바꿀 수 있음).

awk '
  { gsub(","," ")
    $0=gensub("([[:upper:]])([[:digit:]])","\\1 \\2","g")
    $0=gensub("([[:lower:]])([[:upper:]])","\\1 \\2","g")
    print
  }' file.csv

답변2

적어도 gawk(GNU awk) 및 의 경우 mawkmatch함수를 사용하여 소문자에서 대문자로 또는 대문자에서 숫자로 변환하는 인덱스를 찾은 다음 substr문자열을 자르고 닫는 데 사용할 수 있습니다.

awk -F, '
  {c = match($1,/[a-z][A-Z]/)} 
  c>0 {$1 = sprintf("%s %s", substr($1,1,c), substr($1,c+1))}
  {c = match($4,/[A-Z][0-9]/)} 
  c>0 {$4 = sprintf("%s %s", substr($4,1,c), substr($4,c+1))}
  1' file.csv
Xiao Li 6705462234 [email protected] NC 764
Natkin Pook 8044344528 [email protected] VA 22345
Elizi Moe 5208534566 [email protected] AZ 85282
Ma Ta 4345667345 [email protected] TX 91030
Diana Cheng 5203456789 [email protected] WY 4587
Jackson Five 5206564573 [email protected] AZ 85483
Adi SrikanthReddy 6578904566 [email protected] WS 67854

미국 우편번호가 있는 경우 $4제가 아는 한 형식은 고정되어 있으므로 두 번째 우편번호를 건너뛰고 다음을 match수행하면 됩니다.

awk -F, '                                                                                          
  {c = match($1,/[a-z][A-Z]/)} 
  c>0 {$1 = sprintf("%s %s", substr($1,1,c), substr($1,c+1))} 
  {$4 = sprintf("%s %s", substr($4,1,2), substr($4,3))}
  1' file.csv

길이가 0인 어설션을 허용하는 정규식 엔진(예: Perl)이 있으면 좀 더 깔끔해집니다.

perl -F, -ne '
  print join " ", map { s/(?<=[[:lower:]])(?=[[:upper:]])|(?<=[[:upper:]])(?=[[:digit:]])/ /; $_ } @F
' file.csv
Xiao Li 6705462234 [email protected] NC 764
Natkin Pook 8044344528 [email protected] VA 22345
Elizi Moe 5208534566 [email protected] AZ 85282
Ma Ta 4345667345 [email protected] TX 91030
Diana Cheng 5203456789 [email protected] WY 4587
Jackson Five 5206564573 [email protected] AZ 85483
Adi SrikanthReddy 6578904566 [email protected] WS 67854

관련 정보