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