忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024年04月29日09:13 】 |
UNIXコマンドで、ファイル行数をカウントして合計値を出す
久しぶりの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
【2012年04月26日11:13 】 | 未選択 | コメント(0)
コメントの投稿













前ページ | ホーム | 次ページ

忍者ブログ [PR]