shellでcsvを扱うテクを Sagasoon.
プログラム初心者さんに送る成長の糧シリーズです。
今回は「改造」ということに主眼を置いて進みますね。
前回1回目に続き、2回目です。
1回目がまだの方は、下記の記事をみてください。

今回の「成長の糧」は、プログラムを改造するという「遊び」をしています。
おさらい
前回のおさらいです。
あるWebシステムがあり、そこのアクセスするアカウントの一覧がありました。
一覧は、こんなCSVファイルで表現してました。
id_list.csv
test001,テスト001,テストするときのアカウント1号 test011,テスト011,テスター1号に割り振ったアカウント test012,テスト012,テスターAさんに割り振ったアカウント
これを、こんなshellのプログラムで、1行ずつ読み出してみましたね。
#!/bin/sh cat id_list.csv | while IFS=, read id name biko do echo "$id ($name) :$biko" done
ちなみに、実行した結果は、こんな結果となりました。
test001 (テスト001) :テストするときのアカウント1号 test011 (テスト011) :テスター1号に割り振ったアカウント test012 (テスト012) :テスターAさんに割り振ったアカウント
ログファイルを読み込む
さて、今日は、こんなファイルも一緒に考えます。
log.csv
2020-01-01,12:00:12,N,test001,LGIN, 2020-01-01,12:01:12,N,test001,SRCH,商品,マスク ボックス 2020-01-01,12:01:24,N,test012,LGIN, 2020-01-01,12:04:32,N,test012,SRCH,商品,トイレットペーパー 2020-01-01,12:05:42,N,test012,VIEW,SH-12342223 2020-01-01,12:10:34,N,test012,VIEW,SH-12311223 2020-01-01,12:12:54,N,test001,VIEW,SH-22311223 2020-01-01,12:13:01,E,-,LGN,認証に失敗しました。正しいIDとパスワードを指定してください 2020-01-01,12:13:33,N,test021,VIEW,SH-22311223
ログファイルです。
Webサイトを利用した方が、どんな操作をしましたよというのを履歴として残したものです。
ぱっとみると、「LGIN」(ログイン処理)の行などがありますから、ログインしてるなというのは分かりますが、「test001がどんな一連の処理をしたのか?」というのが分かりにくいです。
ユーザごとに見える化する
各ユーザさんがどんな処理をしたかというのが分かると、とても見やすいかもですね。
そしたら、grep コマンドで「フィルター」をかけてみますか。
[user@users001 csv]$ grep test001 log.csv 2020-01-01,12:00:12,N,test001,LGIN, 2020-01-01,12:00:12,N,test001,SRCH,商品,マスク ボックス 2020-01-01,12:00:12,N,test001,VIEW,SH-22311223
ログインした後、マスクとかで商品検索して、閲覧してるんだ
というのが見える化できましたね。
log.csvの中身を1行ずつ読み込んで、「test001」って書いてある行だけを出すっていうコマンドで、それが分かりました。
はい、初心者さん。
こうゆうところで、応用してください。
- test002ならどうするか?
- LGINだけを抜き出す場合もあるかな?
- ある商品をみたユーザを探す場合もあるかな?
その場合は、どうしますかね?考えましょう。
shellに盛り込むには?
grepを使うと、あるキーワードで書かれた行だけを抽出できることが分かりましたね。
そうしたら、csvを読み込むshellを改造して、ユーザ事に出来るようにしてみましょう。
#!/bin/sh cat id_list.csv | while IFS=, read id name biko do echo "$id ($name) :$biko" done
のシェルを改造するわけです。
do~doneの中が、「1行ずつ」の単位で実行されるんですよね?
$id ってのが、ユーザIDが入っている変数でした。
grep コマンドを使うと、ファイルの中から、「フィルター」された行が表示されますね?
ってことは、どう改造しましょう?
shellに盛り込む
どうです?
思いつきましたか?
#!/bin/sh cat id_list.csv | while IFS=, read id name biko do echo "--$id-----" grep "$id" log.csv done
です。
grepの前に、echo で、ユーザ名を入れてあげました。
ここから、このユーザの履歴ですよ、っていうのが分かりやすいかなと思いまして。
結果
[user@users001 csv]$ ./csv.sh --test001----- 2020-01-01,12:00:12,N,test001,LGIN, 2020-01-01,12:00:12,N,test001,SRCH,商品,マスク ボックス 2020-01-01,12:00:12,N,test001,VIEW,SH-22311223 --test011----- --test012----- 2020-01-01,12:00:12,N,test012,LGIN, 2020-01-01,12:00:12,N,test012,SRCH,商品,トイレットペーパー 2020-01-01,12:00:12,N,test012,VIEW,SH-12342223 2020-01-01,12:00:12,N,test012,VIEW,SH-12311223
ユーザごとにどんな手順で何をしたか、時間を追ってみられましたね。一目瞭然です。
まとめ
いかがでしょうか?
改造しながら、改造する方法や考え方を盛り込みながら、お話を進めてきましたが、何かいいアイデア出てきましたか?
色々なソースをみて、自分のアイデアを少しだけ盛り込むというトレーニング(遊び)は、初心者さんにとって、最高の成長の糧になります。
どうぞ、楽しんでやってみてくださいね。


コメント