プログラムと政治とオカルトと戯れ言
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
久しぶりのUNIXコマンド・・・。
やりたいこと、以下のファイルの行数をカウントして合計値をUNIXコマンドで出す。 root@root-PC ~/reversi
$ ls -1 log2/6x6_17
6x6_00000.log
6x6_00001.log
6x6_00002.log
6x6_00003.log
6x6_00004.log
6x6_00005.log
方法①
forで、log2フォルダ配下のファイルを読み込んで、sedで空白をカンマに置換してhoge.txtに保存
root@root-PC ~/reversi
$ for l in `ls -1 log2/6x6_17`; do wc -l log2/6x6_17/$l | sed s/" "/,/ >> hoge.txt; done;
root@root-PC ~/reversi
$ cat hoge.txt
99991,log2/6x6_17/6x6_00000.log
100000,log2/6x6_17/6x6_00001.log
100000,log2/6x6_17/6x6_00002.log
100000,log2/6x6_17/6x6_00003.log
100000,log2/6x6_17/6x6_00004.log
89973,log2/6x6_17/6x6_00005.log
保存した、hoge.txtを、cutで、カンマ区切りの要素を切り出し
root@root-PC ~/reversi
$ cat hoge.txt | cut -d, -f1;
99991
100000
100000
100000
100000
89973
これを、awkでカウント。
root@root-PC ~/reversi
$ cat hoge.txt | cut -d, -f1 | awk '{s += $1} END {print "total is",s}';
total is 589964
以上。なんかスマートじゃない。一発でだしたい。
方法②
一発で出す方法。 root@root-PC ~/reversi
$ for l in `ls -1 log2/6x6_17`; do wc -l log2/6x6_17/$l | awk '{printf("%s,%s\n", $1, $2);}'; done | cut -d, -f1 | awk '{s += $1} END {print "total is",s}';
total is 589964
このコマンドの説明 forでlog2配下をぐるぐる回しながら、awkでカンマ区切り文字に変換。
root@root-PC ~/reversi
$ for l in `ls -1 log2/6x6_17`; do wc -l log2/6x6_17/$l | awk '{printf("%s,%s\n", $1, $2);}'; done;
99991,log2/6x6_17/6x6_00000.log
100000,log2/6x6_17/6x6_00001.log
100000,log2/6x6_17/6x6_00002.log
100000,log2/6x6_17/6x6_00003.log
100000,log2/6x6_17/6x6_00004.log
89973,log2/6x6_17/6x6_00005.log
次に、カンマ区切り文字から、要素1をcutコマンドを用いて取り出す。
root@root-PC ~/reversi
$ for l in `ls -1 log2/6x6_17`; do wc -l log2/6x6_17/$l | awk '{printf("%s,%s\n", $1, $2);}'; done |cut -d, -f1
99991
100000
100000
100000
100000
89973
以上を方法①と同じようにカウントアップ。
cut、awk、sed、は、よく使うので覚えておくと便利。 PR |