Diary

Diary

日々学んだことをアウトプットする場として初めてみました

ワンライナーで電話番号チェック

電話番号かどうかを判定して、それをハイフン区切りで表示したい!

やりたいことを分割する

  • 桁数がちょうど11桁(携帯電話)かどうかチェック
  • 使われている文字が全て数字かどうかチェック
  • 3-4-4文字に区切って、ハイフンつなぎにする

桁数チェック

  • awkのlength関数を使った
    • 日本語に対しては単純な長さにはなってない
echo 0120 | awk '{print length($0)}'
> 4
echo hoge | awk '{print length($0)}'
> 4
echo ほげ | awk '{print length($0)}'
> 6
  • 11桁の時のみ、それを表示する
echo 00011112222 | awk 'length($0)==11{print $0}'
> 00011112222
echo 00011112222aaa | awk 'length($0)==11{print $0}'
> 

全てが数字かどうかチェック

  • awkを使って条件に合ってたらprintしてる
    • awkでのパターンマッチは「if($i ~/patterns/)」みたいにもかける
    • 正規表現に慣れておく
echo 123 | awk '{if($0 ~/^[0-9]+$/){print $0}}'
> 123
echo 1a3 | awk '{if($0 ~/^[0-9]+$/){print $0}}'
> 

11桁の数字を3-4-4に分ける

  • sed正規表現
    • グループ化して後に使うために、ヒットした文字列を()で括っている
      • エスケープせなあかん
    • 使うときは\1,\2とかいう感じで使う
      • エスケープせなあかん
echo 00011112222 | sed 's@\(...\)\(....\)\(....\)@\1-\2-\3@'
> 000-1111-2222

全てを合わせてみる

echo 00011112222 | awk 'length($0)==11{print $0}' | awk '{if($0 ~/^[0-9]+$/){print $0}}' | sed 's@\(...\)\(....\)\(....\)@\1-\2-\3@'
> 000-1111-2222

ファイルに保存された各行に対してチェック

  • 適当なファイルを用意する
cat phone_num
> 09012345687
0901234568745
41340901491
0909XX09034
09034450012
08034514148
08014457908
09034523445
aaberfafaaa
cat phone_num | awk 'length($0)==11{print $0}' | awk '{if($0 ~/^[0-9]+$/){print $0}}' | sed 's@\(...\)\(....\)\(....\)@\1-\2-\3@'

電話番号がN列目に書いてある情報の時

  • 例えば次のようなファイル
cat personal_info
> Name    ADDRESS  08034521908
> ...
  • awkで3列目だけ取り出す
cat personal_info| awk '{print $3}'
> 08034521908
> 09012345687
> 0901234568745
> 41340901491
> 0909XX09034
  • それに対してさっきのをつなげる
cat personal_info| awk '{print $3}' | awk 'length($0)==11{print $0}' | awk '{if($0 ~/^[0-9]+$/){print $0}}' | sed 's@\(...\)\(....\)\(....\)@\1-\2-\3@'

先頭3桁をチェック

  • 書いてて、先頭が0X0(X=7,8,9)かも調べたくなったので、ついでにやる
  • awk正規表現を使ったパターンチェック
    • 条件に一致するときのみプリント
echo 080090 | awk '$0 ~/^0[7-9]0/{print $0}'
> 080090
echo 0800aa0 | awk '$0 ~/^0[7-9]0/{print $0}'
> 0800aa0
echo 01800aa0 | awk '$0 ~/^0[7-9]0/{print $0}'
> 
  • さっきの例
cat personal_info| awk '{print $3}'
> 08034521908
> 09012345687
> 0901234568745
> 0909XX09034