ファイルデータから電話番号列を解析しようとしています。
XiaoLi,lxiao,[email protected],6705462234,Jackson,NC764
NatkinWilliam,wnatkin,[email protected],8044344528,Salem,VA22345
EliziMoe,emoe,[email protected],5208534566,Tempe,AZ85282
MaTa,mta,[email protected],4345667345,Austin,TX91030
DianaCheng,dcheng,[email protected],5203456789,Matitsi,WY4587
JacksonFive,jfive,[email protected],5206564573,Kyenta,AZ85483
AdiSrikanthReddy,sadi1,[email protected],6578904566,Wyo,WS67854
電話番号を取得して再構成するスクリプトを作成しています。電話番号の列を切り離すことができました。
phonm=`awk -F, '{ print $4 }' data3`
単独で使用すると出力が出ます。
6705462234
8044344528
5208534566
4345667345
5203456789
5206564573
6578904566
問題は、この番号を###-###-####の形式で指定する必要があることです。
だから私はコマンドを使用しました
echo "${phonm:0:3}-${phonm:3:3}-${phonm:6:4}"
これを実行すると、目的の結果が得られます。ただし、最初の行だけを印刷/フォーマットします。
670-546-2234
このコマンドを列の下に繰り返すにはどうすればよいですか?
答え1
awk
ハイフンで区切られた文字列部分を印刷するように指示します。
awk -F, '{print substr($4,1,3) "-" substr($4,4,3) "-" substr($4,7,4)}' < data3
出力例:
670-546-2234
804-434-4528
520-853-4566
434-566-7345
520-345-6789
520-656-4573
657-890-4566
出力を取得する理由は、awkのすべての出力をシェル変数に保存してから、文字列の特定の部分を要求するためです。変数自体には改行文字が含まれ、すべての電話番号が含まれています。手動で繰り返すか、awkで実行するだけです。
$ echo "$phonm" |od -c
0000000 6 7 0 5 4 6 2 2 3 4 \n 8 0 4 4 3
0000020 4 4 5 2 8 \n 5 2 0 8 5 3 4 5 6 6
0000040 \n 4 3 4 5 6 6 7 3 4 5 \n 5 2 0 3
0000060 4 5 6 7 8 9 \n 5 2 0 6 5 6 4 5 7
0000100 3 \n 6 5 7 8 9 0 4 5 6 6 \n
0000115
答え2
パールです。
perl -F, -anE'$F[3] =~ /(\d{3})(\d{3})(\d{4})/; say "$1-$2-$3"' data3
-F
Perlに各行をカンマで区切るように指示する
-anE
Perlに行を配列に入れるように指示し(a
)、各行を処理し(n
)、Perl 5.10を使用して後ろのコードを実行します。
$F[3]
必須列です
次に、正規表現マッチングで3桁のグループをキャプチャします$F[3]
。最後に、間に負の数を使用してSTDOUTとして印刷します。
data3
入力ファイルです。