久しぶりの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