• 締切済み

cygwinでのテキスト処理方法がわかりません。

CSVファイルで1~3列目に値が入っています。1列目と2列目が同じ行を抜き出し、同じ行の3列目の値を足し合わせる事は簡単にできますでしょうか? たとえば 1 0 10 1 0 20 1 1 5 2 0 5 2 1 10 の構造で、1列目が1で、かつ2列目が0の行について足し合わせた値(この場合;30)をスクリプトで処理したいのですが? どうぞよろしくお願い致します m(..)m

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

1つにまとめた行は、出現順序順に表示する仕様とします。 以下のスクリプトを作成して下さい。 ------------------------------------- while(<>){ @elm = split(/,/,$_); $key = $elm[0] . ',' . $elm[1]; if (!defined $wa{$key}){ $keytbl[$lno++] = $key; } $wa{$key} += $elm[2]; } foreach $key (@keytbl){ print $key,',',$wa{$key},"\n"; } ------------------------------------- これをsample.pl と言うファイル名で保存します。その後、 perl sample.pl CSVファイル名 と入力します。 結果が画面に表示されます。 ファイルに保存したいなら、 perl sample.pl CSVファイル名 > 保存ファイル名 と入力します。 以下、data.csvが 1,0,10 1,0,20 1,1,5 2,0,5 2,1,10 2,1,15 の時 perl sample.pl data.csvの結果です。 1,0,30 1,1,5 2,0,5 2,1,25

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.6

出力が順不同でいいなら、 awk -F, '{a[$1,$2]+=$3}END{for(i in a) print i "," a[i]}' cygwinということなのでbashでの操作を想定です。コマンドプロンプト(CMD)での操作なら、スクリプト部分をファイルに書いて、-f オプションで指定ですね。 データを見る限り、ソートされているように見えるので、結果をソートするなら、 sort -t, -n ですかね。

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>CSVですので カンマ区切りです。 ということは、データは 1, 0, 10 ・・・1行目 1, 0, 20 ・・・2行目 1 ,1, 5  ・・・3行目 2 ,0, 5  ・・・4行目 2 ,1, 10 ・・・5行目 2 ,1, 15 ・・・6行目 のようになっているということでしょうか? 3列目の和は、この場合、1行目と2行目ので結果が30、5行目と6行目 で結果が15となりますが、これを、どのように、表示したいのですか。

kenken09
質問者

お礼

返答ありがとうございます。 1, 0, 10 ・・・1行目 1, 0, 20 ・・・2行目 1 ,1, 5  ・・・3行目 2 ,0, 5  ・・・4行目 2 ,1, 10 ・・・5行目 2 ,1, 15 ・・・6行目 を処理し 1, 0, 30 ・・・1行目 1 ,1, 5  ・・・2行目 2 ,0, 5  ・・・3行目 2 ,1, 25 ・・・4行目 と計算させたいのですが。

すると、全ての回答が全文表示されます。
noname#29459
noname#29459
回答No.4

質問内容が、明瞭ではないですね。 1列めが1で、かつ2列めが、0の行の3列めの値の総和をとってくるだけなのでしょうか? それとも、総和の30を、どう、スクリプト処理したいのでしょうか。 awkのFS(フィールドセパレータ)は、デフォルトで、スペースですので、カンマがあるのであれば、FS=","などとします。

参考URL:
http://uguisu.skr.jp/Windows/awk.html
kenken09
質問者

お礼

すいません。説明不足でした。 3列目について、1-2列が同じものを足し合わせたいのです。 1, 0, 10 1, 0, 20 1, 1, 5 1, 1, 5 2, 0, 5 2, 0, 10 2, 1, 10   ↓ <スクリプト処理>   ↓ 1, 0, 30 1, 1, 10 2, 0, 15 2, 1, 10  という計算をしたいのですが。 awkを使うと列の区別は出来るのですが  >*.csv とすると、処理後のファイルには列の区別がなくなりなく2-3列目が 1列にまとめられてしまいます。 何度もすいません、よろしくお願いいたします

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

列と列の間は何で区切られてますか?

kenken09
質問者

補足

返信ありがとうございます。 CSVですので カンマ区切りです。

すると、全ての回答が全文表示されます。
noname#29459
noname#29459
回答No.2

awkが、一番、簡単でしょう。

kenken09
質問者

お礼

ありがとうございます。 awk で FS設定を行い、1~3の列を、列ごとにCSVのセルに吐き出すことが出来ません。これは可能でしょうか?

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

できるか。という質問に対する答えなら「できます」 awkでもPerlでもbashのスクリプトでもお好きなもので。

kenken09
質問者

お礼

ありがとうございます。 awkを使って処理をするとCSV形式でアウトプット(列セルを隔てた数値処理)ができないのですが、どのようにすればよろしいのでしょうか? grepで処理しようとかんがえているのですがなかなか出来ない状況です。

すると、全ての回答が全文表示されます。

関連するQ&A