Slide 1

Slide 1 text

知って得するかもしれない テキスト処理理コマンドのお話 @serima

Slide 2

Slide 2 text

⾃自⼰己紹介  |  PHP歴 今年年で  8  年年⽬目   初めての  PHP  勉強会への参加   今後も頑張りたい

Slide 3

Slide 3 text

ビッグデータと僕 ソーシャルゲームの運⽤用   データ命   アクセスログ、課⾦金金ログ、戦闘ロ グ、カード取得ログ…

Slide 4

Slide 4 text

データのダンプ mysqldump   scp

Slide 5

Slide 5 text

TreasureData あらゆるログを  TreasureData  に集 約   これで取り出しやすくはなった

Slide 6

Slide 6 text

ディレクターさん 「せりまさん、こんなデータ取って ください」   「おk」

Slide 7

Slide 7 text

巨⼤大なデータ いざ取り出してみると、数⼗十万〜~数 百万⾏行行になることはザラ   この規模のデータを  Excel  で開くと 死亡   なので、ある程度度サマリする必要が でてきます

Slide 8

Slide 8 text

サマリするためのスクリプト データ規模が⼤大きくなってくると PHP  つかって書くと超遅い

Slide 9

Slide 9 text

それ… UNIX  コマンドでできるよ

Slide 10

Slide 10 text

よく使うコマンド cat,  sort,  uniq,  wc,  grep,  awk,   diff,  cut,  sed

Slide 11

Slide 11 text

join ふたつのファイルの共通  key  で連結   ふたつのファイルは結合するフィー ルドで  sort  しておく必要がある

Slide 12

Slide 12 text

join  の使⽤用例例 a.txt  には  ユーザ  ID,  課⾦金金額,  戦闘⼒力力  の順で⼊入ってる   b.txt  には  ユーザ  ID,  ユーザ名  の順で⼊入ってる   join  -‐‑‒a1  -‐‑‒eʼ’-‐‑‒ʼ’  -‐‑‒oʼ’0  1.2  1.3  2.2ʼ’  <(sort  a.txt)  <(sort  b.txt)

Slide 13

Slide 13 text

プロセス置換  |  知ってる? <(sort  a.txt)   bash  や  zsh  の機能   sort  済みのテンポラリファイルを作 る必要がなくなる

Slide 14

Slide 14 text

プロセス置換  |  知らない これを知るまで   cat  a.txt  |  sort  >  a_̲sorted.txt   無駄なファイル量量産してた

Slide 15

Slide 15 text

集合演算っぽいこと A  に含まれるが、B  に含まれない  ID   を出したい 1   2   3 1   3 2 A B ほしい結果

Slide 16

Slide 16 text

差集合 diff  と  awk  でできるよ diff  <(sort  A)  <(sort  B)  |  awk  ʻ‘/^

Slide 17

Slide 17 text

他の集合演算 和集合  A∪B   cat  A  B  |  sort  |  uniq   積集合  A∩B   cat  A  B  |  sort  |  uniq  -‐‑‒d   join  A  B

Slide 18

Slide 18 text

join  コマンド join  コマンドはとても便便利利だけど、 ふたつの引数しかとることができな い

Slide 19

Slide 19 text

tsv  や  csv  に  query  投げたい あるんです   q  -‐‑‒  Text  as  Data   https://github.com/harelba/q   q  って!ググラビリティ低すぎ

Slide 20

Slide 20 text

試しに使ってみる %  seq  1  1000  |  q  "select  avg(c1),sum(c1)  from  -‐‑‒"   500.5  500500 c1というのが、カラムの1番⽬目という意味なので、   avg(c1)で、1〜~1000の総和の平均   sum(c1)で、1〜~1000の総和   がちゃんと出てますね

Slide 21

Slide 21 text

GROUP  BY  も使える %  cat  test.txt   Mike        10   John        1   Bob          8   Mary        19   Bob          15   Bob          20   Mike        2       %  q  "select  c1,  count(*),  sum(c2)  from  test.txt  group  by  c1"   Bob  3  43   John  1  1   Mary  1  19   Mike  2  12

Slide 22

Slide 22 text

JOIN  も使える %  cat  test1.txt   a1234      aa1   b1234      aa2   c1234      aa3   d1234      aa3   ! %  cat  test2.txt   1              a1234      bb1   2              a1234      bb2   3              b1234      cc1   4              c1234      dd3   5              e1234      NULL   ! %  q  "select  *  from  test1.txt  as  a  left  join  test2.txt  as  b  on  a.c1  =  b.c2"   a1234  aa1                1  a1234  bb1   a1234  aa1                2  a1234  bb2   b1234  aa2                3  b1234  cc1   c1234  aa3                4  c1234  dd3   d1234  aa3

Slide 23

Slide 23 text

ご清聴ありがとうございました ブログにこの事書いてるのでご興味 あればどうぞ   http://serima.co/blog