アンケート集計用

アンケートを作ったは良いがコーディングをしておらず集計に困ることがあります。大きいデータならコーディング作業も仕方ないのですが,100件程度のデータで自由回答形式が多い場合,コーディング作業をするのも煩わしいことがあります。Openoffice Calcなどで入力を済ませたものの分析方法が分からないという質問を受けたことがありませんか?

以下のgawkスクリプトは作成したCSVファイルを無理やり集計してくれます。たとえば,jugemu.csv
#ID,#data1,#data2,#data3,#data4
1,じゅげむじゅげむ,ごこうのすりきれ,かいじゃりすいぎょのすいぎょうまつ,うんらいまつ
2,ふうらいまつ,くうねるところにすむところ,やぶらこうじのぶらこうじ,ぱいぽぱいぽ
3,ぱいぽのしゅーりんがん,しゅーりんがんのぐーりんだい,ぐーりんだいのぽんぽこぴーの,ぽんぽこなーの
4,ちょうきゅうめいの,ちょうすけ,じゅげむじゅげむ,ごこうのすりきれ
5,じゅげむじゅげむ,ごこうのすりきれ,かいじゃりすいぎょのすいぎょうまつ,うんらいまつ
6,ふうらいまつ,くうねるところにすむところ,やぶらこうじのぶらこうじ,ぱいぽぱいぽ
7,ぱいぽのしゅーりんがん,しゅーりんがんのぐーりんだい,ぐーりんだいのぽんぽこぴーの,ぽんぽこなーの
8,ちょうきゅうめいの,ちょうすけ,じゅげむじゅげむ,ごこうのすりきれ
9,じゅげむじゅげむ,ごこうのすりきれ,かいじゃりすいぎょのすいぎょうまつ,うんらいまつ
10,ふうらいまつ,くうねるところにすむところ,やぶらこうじのぶらこうじ,ぱいぽぱいぽ
というデータを,
gawk -f chkn.awk jugemu.csv 2 5
と処理すると,jugemuN.csvというファイル
Column, Answer, number
002,    #data1,1
002,じゅげむじゅげむ,3
002,ちょうきゅうめいの,2
002,ぱいぽのしゅーりんがん,2
002,ふうらいまつ,3
003,    #data2,1
003,くうねるところにすむところ,3
003,ごこうのすりきれ,3
003,しゅーりんがんのぐーりんだい,2
003,ちょうすけ,2
004,    #data3,1
004,かいじゃりすいぎょのすいぎょうまつ,3
004,ぐーりんだいのぽんぽこぴーの,2
004,じゅげむじゅげむ,2
004,やぶらこうじのぶらこうじ,3
005,    #data4,1
005,うんらいまつ,3
005,ごこうのすりきれ,2
005,ぱいぽぱいぽ,3
005,ぽんぽこなーの,2
が出力されます。
もしかすると本格的解析前の入力チェックに便利かもしれません。

# chkn.awk
# 欄毎に出てきた数字/文字の数を表示する

BEGIN	{
	FS = ","
	split(ARGV[1], f, ".")
	outfile = f[1]"N.csv"
	snf = ARGV[2]		# 解析開始欄を指定
	lnf = ARGV[3]		# 解析終了欄を指定
	delete ARGV[2]; delete ARGV[3]
	# 後の作業のために見出しの単語には印(#など)を付けておく方が良い
}
	{
	lnr = NR
	for (i = snf; i <= lnf; i++) { Fi[i","lnr] = $i"" }
	for (i = snf; i <= lnf; i++) {
		k = l[i]
		for (j = 1; j <= k; j++) {
			if (Fi[i","lnr] == Fn[i","j]) {
				n[i","j]++
				m = "1"
			}
		}
		if (m != "1") {
			k++
			Fn[i","k] = Fi[i","lnr]
			n[i","k]++
			l[i] = k
		}
		m = "0"
	}
	for(i in Fi) { delete Fi[i] }
	printf("NR = %d\r", lnr)
}
END	{
	print "\nSummarizing:"
	for(i in l) { delete l[i] }
	for(i in Fn) {
		if(n[i] > 0) {
			split(i, J, ",")	# jを使うとエラーになることがある。
			printf("%03d,%10s,%s\n", J[1],Fn[i],n[i]) > "temp.xxx"
		}
		delete Fn[i]; delete n[i]
		printf("%d, ", i)
	}
	print ""
	close("temp.xxx")
	while(getline < "temp.xxx" > 0) {
		print | "sort > temp.xx"
	}
	close("temp.xxx")
	close("sort > temp.xx")
	print "Column, Answer, number" > outfile
	while(getline < "temp.xx" > 0) {
		print > outfile
	}
	close("temp.xx")
	print "" > "temp.xxx"
	print "" > "temp.xx"
}
# l[i] が大きすぎるとエラーになる.
# 数列で100行程度なら全データが異なるものであっても処理できる.
# 標準の SUBSEP を用いるとメモリ消費が多くなる.

GAWKホームページに戻る