ここから本文です

cygwinでのテキスト処理方法がわかりません。 CSVファイルで1~3列目に値が入っ...

k_m********さん

2008/7/1901:26:25

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

閲覧数:
823
回答数:
1

違反報告

ベストアンサーに選ばれた回答

at2********さん

編集あり2008/7/2119:54:46

質問文が変では?
冒頭では「1列目と2列目が同じ行を抜き出す」と書いておられますが、例では「1列目が1で、かつ2列目が0」のように違う場合を上げているのでちょっと回答しようにも???になります。


とりあえず、ある程度のパターンを想定して回答します。
CSVファイルを仮に test.csv として、
■1列目と2列目が同じであれば、そのような行の3列目の値を足し合わせる
awk 'BEGIN{sum=0} {if($1==$2){sum+=$3}} END{print sum}' a.csv
これを、コマンドで入力すればいいと思います。(cygwinのシェル上に上の1行をコピペして実行すればいいです)
※解説
・BEGIN{sum=0} は無条件に一番最初に実行される部分です。ここでは合計値を保持する変数 sum の値を0に初期化しています
・$1は1列目、$2は2列目、$3は・・・・・・を示します
・{......} は、すべての行で実行される処理です。ここで if($1==$2) と書いているので、1列目と2列目が等しいかを判定しています。== は「等しい場合」を意味します。等しければ if文の {sum+=$3} を実行します。つまり、3列目の値を合計値sumに足しています。
・END{....} は、一番最後に無条件に実行される部分です。ここでは END{print sum} としているので、変数sumの値を表示しています。

■1列目と2列目が違っていれば、そのような行の3列目の値を足し合わせる
awk 'BEGIN{sum=0} {if($1!=$2){sum+=$3}} END{print sum}' a.csv
※解説
・違う場合なので、if文の条件が $1 != $2 になっています。!= は「異なる場合」を意味します。

■1列目が1で、かつ2列目が0の行について足し合わせた値(この場合;30)
awk 'BEGIN{sum=0} {if(($1==1)&&($2==0)){sum+=$3}} END{print sum}' a.csv


これ以外のパターンは応用してください。awk というコマンドのマニュアルをご覧になってください。
http://www.pinkdragon.net/doc_lib/contents/ja/linux_man/gawk.1.html

この回答は投票によってベストアンサーに選ばれました!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる