68user's page 掲示板

Prev< No. 4285〜4295> Next  [最新発言に戻る] [過去ログ一覧]
No. 4285 # シャチ 2005/09/10 (土) 10:00:34
>>4280 くま
以下ので出来ると思います。

----------------------------------
#!/bin/sh

nawk -F"," '
        BEGIN {
        }
function syukei() {
        total=0+0;
        no=$1;

        while (NF>0) {
                if (no == $1) {
                        total = total + $2;
                } else {
                        printf("%03d:%d\n",no,total);
                        no=$1;
                        total=$2;
                }
                getline;
        }
        printf("%03d:%d\n",no,total);
}
{
        if (NF == 0) next ;
        syukei() ;
}' file.txt

exit 0

No. 4286 # nagadomi 2005/09/10 (土) 22:58:12
続々と投稿されているので投稿してみます。

>>4280 くま
awkなら、
$ nawk -F, '{v[$1]+=$2;}END{for(k in v) print k","v[k]}' data.txt | sort
とできると思います。
/+ data.txt -> データファイル +/

No. 4287 # シャチ 2005/09/11 (日) 15:03:55
>>4286 nagadomi

nagadomiさんのコード凄いですね。
1行で実現してしまうなんて。
自分も、1行で実現できないかと試みてはみたのですが、良い案が浮かび
ませんでした。

向学として教えていただきたいのですですが、
番号の比較、判断していませんが、何故、上手く出来ているのですか。

>'{v[$1]+=$2;}END{for(k in v) print k","v[k]}'
宜しくお願いします。

No. 4288 # zsh 2005/09/11 (日) 20:20:12
>>4286 nagadomi
うわー、awkってforでその表記できるんだっけー。
すっかり忘れてました。
最近awk触っていなかったとは言え、恥ずかしい・・・

>>4287 シャチ
>for(k in v)
は、配列vの値を一つ一つ変数kに代入してループするという意味です。

No. 4289 # zsh 2005/09/11 (日) 23:44:55
>>4288 zsh
×配列vの値を一つ一つ変数kに代入してループする
○配列vの添字を一つ一つ変数kに代入してループする

No. 4290 # nagadomi 2005/09/12 (月) 03:38:59
>>4287 シャチ
zshのおっしゃるとおりです。
Perlでいうforeach的な使い方です。

>>4288 zsh
awkは、1年ほど前に1日(プログラム一個..)使ったことがあるだけだったので、
実はリファレンスをちょっと見ました。
そこでforeachあるじゃんと..。知らない分、確認するのでうまくいった感じですかね..。

zshさんのコードは、ソートを考えて、あのような書き方をしているのかと思っていました。
私は普段、こういうのにはPerlを使っています。

No. 4291 # シャチ 2005/09/12 (月) 11:55:17
>>4288 zsh

番号の比較、判断していませんが、前後が同じかどうかの判断は
どこでしているのですか。
>{v[$1]+=$2;}
で判断しているのですか。
お願いします。

>>4290 nagadomi
Perlを使うのが便利なのですか。
Perlは、人が作ったのをメンテナンスするため1日調べたのみです。

No. 4292 # シャチ 2005/09/12 (月) 13:52:41
>>4288 zsh

配列vの添え字が、番号なんですね。
だから、番号の配列要素に割り当てられた値が使用できるから
番号の比較、チェックが不要なんですね。

添え字には、数値しか使用できなと思っていました。
文字列も使えるんですね。

No. 4293 # 68user 2005/09/13 (火) 00:28:29
>>4283 nagadomi
なるほど、length ですか。RFC をあさってみましたが、まだ見つけられません。
発見したらぜひ教えてください。

関係あるかな? と思いつつ、まだちゃんと読んでいない資料:
    http://www.cs.utah.edu/~danderse/adns/arch.html
    http://www.zeroconf.org/Rendezvous/txtrecords.html

No. 4294 # hagu 2005/09/16 (金) 02:32:13
Solaris8で、Bシェル(sh)で以下のことを行いたいのですが、
良い方法を教えてください。

2つのファイルの中身を比較し、その結果を表示したいのです。
--- file1.txt -----
hanako.sato
jiro.yamamoto
taro.yamada
taro-1.yamada
tsuyoshi.saito


--- file1.txt -----
jiro.yamamoto
taro-1.yamada
taro-2.yamada
gou.yamashita

結果
file1 Only, hanako.sato
match,jiro.yamamoto
file1 Only,taro.yamada
match,taro-1.yamada
file1 Only,tsuyoshi.saito
file2 Only,taro-2.yamada
file2 Only,gou.yamashita
と出力したいのです。

お願いします。

No. 4295 # 68user 2005/09/16 (金) 03:18:00
>>4294 hagu
案1. file1.txt を while で 1行ずつ読み込み、読み込んだ行が
          file2.txt に含まれるかを grep で調べる。
案2. file1.txt と file2.txt をそれぞれ sort し、diff をとって、
          行頭が < か、> かを調べる。重複する行は…どうしましょうねぇ。
案3. perl でハッシュに突っ込む。3行くらいで書けそうな気がします。

Prev< No. 4285〜4295> Next  [最新発言に戻る] [過去ログ一覧]