• 締切済み

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% (4848/10262)
回答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

  • CSVファイルを読み込んで計算するには、構造体か?

    はじめまして。C++プログラミングの質問です。 初心者レベルの質問で申し訳ないのですが、お付き合いください。 CSVファイルを読み込んで、書かれている値を使ってある計算を行う、 ということをしたいのですが、処理方法をどうするか悩んでいます。 CSVファイルに書かれる最大行86400行、最大列6000列です。 また、開発環境はLinuxとなります。 私は「CSVファイルの項目を構造体に格納するクラス」と、「構造体の値を使って計算 するクラス」を考えました。 しかし、構造体ですと最大86400行のものを格納するのは、メモリを食うだけで無駄だという 指摘を受けました。 直接ファイルから値をとってきて、計算クラスに処理させるほうが無難と言われましたが、 「CSVファイルの項目を構造体に格納するクラス=データベース」と考えており、 後々拡張する場合に融通が利くのではないでしょうか。 経験が浅いので、断固たる主張ができないのですが・・・ 構造体に入れることばかり考えていたので、開発のボリュームを抑え、かつ、メモリを食わない 方法を全く思いつきません。 有識者の方へアドバイスを受けたいのですが、 ・大量のデータを読み込む場合、構造体等に格納する方が後ほど助かるか、 それとも、直接ファイル読み込みした方がよいか ・構造体格納のほかに相応しいやり方はないか この2点をメインにお答えいただけないでしょうか。 何か良いやりかたがありましたら教えていただきたいです。 よろしくお願い致します。

  • pythonでテキストの処理をしたいと考えています。

    pythonでテキストの処理をしたいと考えています。 複数のデータファイルがあって、どのファイルもデータ1列目、2列目はある決まった並びになっていて3列目だけランダムな値が入ります。 そこでファイルを読み込んで1列目、2列目は一度読み込んだものを別なファイルに書き出し、 それぞれのファイルの3行目を、その別ファイルに次々と加えていく様なプログラムを組みたいのですが、 どういう風に記述したら良いのか思案しています。 たとえば、一つ目のファイル(1.dat) 1 1 5.1 2 1 6.2 3 1 5.5 1 2 7.6 2 2 2.4 2つ目のファイル(2.dat) 1 1 2.5 2 1 3.2 3 1 4.6 1 2 8.0 2 2 1.1 3つ目のファイル(3.dat) 1 1 3.8 2 1 9.6 3 1 1.2 1 2 3.0 2 2 5.5 とあるときに、result.datというファイルに 1 1 5.1 2.5 3.8 2 1 6.2 3.2 9.6 3 1 5.5 4.6 1.2 1 2 7.6 8.0 3.0 2 2 2.4 1.1 5.5 という風に列をどんどんデータを追加していけるようなプログラムです。 アドバイスをどうかよろしくお願い致します。

  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • 科目によって処理を変えたい

    エクセル2003を使っています。 F列に科目名が入っています。 その科目名によってM列の値を見て、N列に返す値が変わってきます。 その処理を2行目から最下行迄、繰り返し処理をしたいと思っています。 例えば、2行目のF列が数学、M列が100と入ってたとします。 数学の場合、M列の値が179以下なら、N列は空白で180以上なら「期限切れ」とN列に表示させたいと思います。 この場合、M列が100なのでN列は空白にしたいと思います。 次に3行目が国語で、M列が377とします。 国語の場合、M列が364以下ならN列は空白で、365以上なら「期限切れ」とN列に表示させたいと思います。 この場合、M列が377なので、N列は期限切れにしたいと思います。 このようなことをVBAでしたいと思います。 どうすれば良いでしょうか? よろしくお願いします。

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • テキスト処理のシェルプログラム

    UNIXシェルもしくはPerlでテキスト処理のシェルスクリプト を作成したいのですがご教授お願いします 1000行あるテキストファイルを 2行単位で区切り2行単位で横一列へ置換しテキストへ出力したいのですが 例 処理前 aaa bbb ccc ddd eee fff 処理後 aaa,ccc,eee bbb,ddd,fff ご教授よろしくお願いします

  • Windows bat でCSVデータを処理したい

    <CSVデータの内容> 0004 10,11,19,12,15,1192,0,00 10,11,20,17,30,1192,1,00 10,11,21,01,00,1193,0,00 10,11,22,20,00,1193,1,00 (1)CSVデータの行ごとに、7番目と8番目の値が0,00の場合、10,11,19を取得して値をDBにインサートしたい。 (2)CSVデータの行ごとに、7番目と8番目の値が1,00の場合、10,11,20を取得して値をDBにインサートしたい。 このような処理をするには、どうしたら、良いでしょうか?

  • テキスト内容をバッチ処理で変換する方法をおしえてください 。

    csvの内容変換をしたいのですが、データの量が大変多いためどのような方法で変換すればよいか悩んでおります。 csvのまま開くと桁数の多い数字や、アルファベットの「E」を含んだ数字の列2.36E+256のようになってしまったり、不具合が起こります。文字列にしてみても解決されずでした。 そのため、その部分を「="」「"」で囲みたいと思ってます。 csvをtxt保存し、バッチで変換することはできますか? たとえば、~番目のカンマの後に「="」をいれ、~番目の前に「”」を入れ、末尾に「"」を入れた後次の行も同じくの処理をするというコマンドは可能なのでしょうか? いろいろ調べてみましたが、答えを見つけ出せません。よい方法があれば教えてください。

  • 外部ファイルから特定の値を取り出して、値ごとに新しいファイルを生成して書き込むには?

    こんにちわ。質問させてください。 ひとつのCSVファイルがあります。1列目の先頭の値はランダムねアルファベットです。 aという値が先頭にある列は、a.csvを生成して、a.csvにaの行を書き込みます。b,cも同様にb.csv,c,csvを生成して書き込みます。 要するに一枚のファイルから値ごとに新しいファイルを生成して書き込みをしたいのです。新しくできたファイルは追加書き込みをしないでの上書きモードです。substr関数を使って値を取り出すまではわかるのですが、そこからの処理がわかりません。どうぞ教えてください。よろしくおねがいします。

    • ベストアンサー
    • Perl
  • バッチ処理でCSVファイルコピーした後の記号削除方法

    こんにちは。バッチ処理作成初心者です。 Windows XP、エクセル2000 を使用しています。 複数のcsvファイルをバッチ処理(下記)でコピーしました。 copy /y aaa.csv+bbb.csv ccc.csv (結合させるcsvファイルは最大6つありますが、 上記コマンドでは2つのcsvファイルを結合させてます。) コピーしたcsvファイル「ccc」を開くと、必ず最終行A列に "・"という記号が現れます。 この記号を、「ccc」を開かずに削除する方法 もしくは、csvファイルをコピーしても記号が現れない方法を 教えてください。 (「ccc」は行数が最大で18万行を超えるため、いつも ファイルを開いて記号を削除することができません。)