スクリプトから別の 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

名前と姓を互いに区別することはできず、州と郵便番号も一緒に実行されます。この2つの状況をどのように区別できますか?

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)との場合、mawkこのmatch関数を使用して、小文字から大文字に、または大文字から数字に変換するインデックスを見つけて、文字列を切り取り閉じるために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私の知る限りフォーマットは固定されているので、2番目の郵便番号をスキップして次のように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

長さがゼロのアサーションを許可する正規表現エンジン(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

関連情報