※ ChatGPTを利用し、要約された質問です(原文:またまたこづかい帳です~)
こづかい帳作成の注意点と時間データの集計方法
このQ&Aのポイント
こづかい帳作成時の注意点として、センセーショナルなタイトルを30文字前後で生成する必要があります。また、質問文章の内容を要約し、100文字程度の要約文を3つ作成する必要があります。さらに、時間データを集計する際には、データの重複を回避するために注意が必要です。
データの重複を回避するための方法として、uniqコマンドを使用することが考えられます。ただし、uniqコマンドを実行する際には、集計前にデータを追加する必要もあります。具体的には、時間のデータが重複する場合は、重複したデータを削除するという処理を行うことができます。
しかし、uniqコマンドを使用する際には注意が必要です。uniqコマンドを実行した段階で重複したデータが削除されてしまうため、必要なデータが失われる可能性があります。そのため、uniqコマンドを実行する前に、重複したデータを追加することを検討する必要があります。
こんばんは。こづかい帳作っててまた分からなくなっちゃいました。
環境はgawkとbashを用いてlogの集計を行っています。
1/1 gohan 1000
1/1 kaimono 5000
1/1 kaimono 2000
1/2 karaoke 3500
1/2 gohan 1200
1/2 gohan 1500
前回このようなlogを元に集計しました。おかげ様で
1/1 gohan 1000
1/1 kaimono 7000
1/2 karaoke 3500
1/2 gohan 2700
このように集計することが出来ました。ありがとうございます。
でも、ここで時間も入れることにしました。その代わり日付はいりません。
それは一日一回logを集計して、終わったら元データを消すことにしたからです。
07:00 gohan 500
11:00 kaimono 2000
12:00 gohan 1000
15:00 oyatu 300
19:00 gohan 2000
というのがありまして、これを
00:00 0 0
01:00 0 0
02:00 0 0
03:00 0 0
04:00 0 0
05:00 0 0
06:00 0 0
07:00 gohan 500
08:00 0 0
09:00 0 0
10:00 0 0
11:00 kaimono 2000
12:00 gohan 1000
13:00 0 0
14:00 0 0
15:00 oyatu 300
16:00 0 0
17:00 0 0
18:00 0 0
19:00 gohan 2000
20:00 0 0
21:00 0 0
22:00 0 0
23:00 0 0
という風にすることは出来るんですか?これをしようとした時に
初めから元のデータに
00:00 0 0
01:00 0 0
02:00 0 0
続く
22:00 0 0
23:00 0 0
を追加してみて、時間のところが重複したら消すとかやるのかな~と
思ったんですが、そのことを先生に話したら、勝手にデータに追加するなんて
ナンセンスだ!って言われちゃいました。それはそうですよね。。。^^
でもuniqコマンドってありますよね。このやり方でも出来ますか?
uniqコマンドして$2>0なら消す。。。あれ?uniqコマンドした時点で
消えちゃってるや。。。ダメじゃ~ん(笑)分かる方教えて下さいな~
お礼
あれ。なんかterra5さんが補足した形になっちゃいました。 ごめんなさい。
補足
お返事ありがとう。 うーん、全くその通りですね(^^; ただ単にデータを増やしているだけだ~(>_<) 「何のためにどういうものをつくりたいのか」だけど、 「こづかいの集計機能の体得のために」 「logを集計してグラフで分かり易くしたい」 です。グラフは集計後のlogをftpを使って自分のパソコンに取り込んで、 Excelでグラフ化するつもりです。でも、 ほんとはね、集計する時にちゃんと1時間づつ区切って 24個のlogを作るつもりだったんだよ。 でも、分からなかったの。あ、違う。えーとー、 { for(i=1;i<=24;i++){ if((100*(i-1) <= $1) && ($1 < 100*i)){ count[i]++ } } } END{ for(i=1;i<=24;i++){ if(count[i] != 0){ print i,count[i] } else { print i,0 } } } ってやると、データがない時に0出るよね?でも、集計する時に { if(length($2) > 0){ kazu[$2] ++; } } END{ for(i in kazu) print $1,i,kazu[i] } ってのを使う場合、for文ってのは同じだけど、これってawk独特の 連想配列ってやつとかで、これと先に書いたfor文を組み合わせることが できないんです。それか、前に教えてもらった { sum[$2,$3] += $4 } END { for(item in sum){ split(item, t, SUBSEP ); printf("%s %s %s %d\n",$1,t[1],t[2],sum[item]); } } これだって、連想配列ですよね?結局、集計が終わってから 「あ、0のデータがない…。」って気付いて、 後から0のデータをくっつけるってことになっちゃったんです。 どうしたらいいですか~?あ、今考えてる方針、 自分が思ってるの言います。時間のフィールドで 23:00だったら、FS=":"ってやってjikan=$1*3600ってやれば 秒数が出ますよね。ここでまた新たに for(i=1;i<=24;i++){ if((3600*(i-1) <= jikan) && (jikan < 3600*i)){ print strftime("%H:%M",jikan),$2,$3 } else { print strftime("%H:%M",jikan),0,0 } } ってやればいいんですか?