Separando o texto da runon no script

0

Eu tenho a seguinte entrada 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

Gostaria que saísse o seguinte:

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 )

Isto é o que eu tenho até agora

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

Estou tendo problemas para separar o Nome e o Sobrenome um do outro e o estado e o código postal também estão sendo executados juntos. Como eu seria capaz de separar esses dois casos?

Eu estou querendo usar o awk, existe uma maneira que eu possa usar algo como [A-Z] para separá-los em sua letra maiúscula?

    
por kittensfurdays 22.03.2018 / 23:46

2 respostas

0

Eu vejo que a resposta do usuário steeldriver já foi aceita, mas eu pensei em oferecer o que eu acho que é uma opção mais curta, mais simples e mais fácil de ler. No mínimo, demonstra algumas outras características do awk (e o OP pode sempre mudar de idéia):

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

Pelo menos com gawk (GNU awk) e mawk , você pode usar a função match para encontrar o índice de uma transição de maiúsculas minúsculas ou dígitos minúsculos e, em seguida, usar substr para cortar e feche a string:

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

Se o seu $4 é realmente um código postal dos EUA, então o formato AFAIK é fixo e você pode pular o segundo match e fazer

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

É um pouco mais claro se você tiver um mecanismo de regex que permita asserções de comprimento zero - como 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
    
por 23.03.2018 / 01:50