人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記のようなデータがあります。ちなみに1列目がネットワーク、2列目がnext hopです。「>」が最短next hopを表しています。すなわち6.14.0.0/15の最短経路は64.57.28.241です。これをネットワークとその最短next hopだけのデータにしたいです。つまり下記のデータを
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
だけにしたいです。

perlで出来ると思うのですがファイルが300MBを超えるので、劇的に早くなる方法があったら教えてください。


6.14.0.0/15 195.215.109.254 67768 0 3292 1239 701 668 i
216.218.252.164 0 6939 1299 701 668 i
74.40.7.36 0 0 5650 7018 701 668 i
> 64.57.28.241 0 0 11537 668 i
200.160.127.238 0 27664 3549 701 668 i
202.147.61.12 1 0 10026 3356 701 668 i
8.0.0.0/9 195.215.109.254 7888 0 3292 3356 i
202.76.224.242 0 24218 10026 3356 i
203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.35 0 0 5650 3356 i
207.246.129.13 0 11608 6453 3356 i


●質問者: labtest
●カテゴリ:コンピュータ インターネット
✍キーワード:109 28 MB NeXT Perl
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● b-wind
●15ポイント

劇的に早くなる

何と比べて?


とりあえず、こんな感じ?

perl -n -e '$first = $1 if /^(\w+)/; printf "%s %s\n", $first, $1 if /^>\s+(\w+)/' < in.txt > out.txt

2 ● zzz_1980
●50ポイント ベストアンサー

一応複数の出口があれば、全部表示します。(そのほうが楽なので)

出口がひとつしかないとき">"はつかないんじゃないかとか、destination がネットワークじゃないとうごかないとか、

余計なところで悩みますが…

% cat nexthop.sh
awk 'BEGIN{FMT="%s %s\n";} index($1,"/")!=0{NEXTNET=$1;} ($2==">"){print NEXTNET,$3;}($1==">"){print NEXTNET,$2;}' <$*
% sh nexthop.sh sample.data
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
8.0.0.10/9 195.215.109.255
8.0.0.10/9 74.40.7.36
% cat sample.data
6.14.0.0/15 195.215.109.254 67768 0 3292 1239 701 668 i
 216.218.252.164 0 6939 1299 701 668 i
 74.40.7.36 0 0 5650 7018 701 668 i
> 64.57.28.241 0 0 11537 668 i
 200.160.127.238 0 27664 3549 701 668 i
 202.147.61.12 1 0 10026 3356 701 668 i
8.0.0.0/9 195.215.109.254 7888 0 3292 3356 i
 202.76.224.242 0 24218 10026 3356 i
 203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.35 0 0 5650 3356 i
 207.246.129.13 0 11608 6453 3356 i
8.0.0.10/9 > 195.215.109.255 7888 0 3292 3356 i
 202.76.224.242 0 24218 10026 3356 i
 203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.36 0 0 5650 3356 i
 207.246.129.13 0 11608 6453 3356 i

3 ● zzz_1980
●15ポイント
% cat nexthop.sh
#!/bin/sh
awk 'BEGIN{FMT1="%s %s\n";FMT2="*** %s %s\n";} \
 index($1,"/")!=0{NEXTNET=$1;f=0;} \
 ($2==">"&&f>0){printf FMT2,NEXTNET,$3;f++;} \
 ($2==">"&&f==0){printf FMT1,NEXTNET,$3;f++;} \
 ($1==">"&&f>0){printf FMT2,NEXTNET,$2;f++;}\
 ($1==">"&&f==0){printf FMT1,NEXTNET,$2;f++;}\
 ' <$*

2つ目以降の重複エントリーには頭に***がつきます。

% ./nexthop.sh sample.data
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
8.0.0.10/9 195.215.109.255
*** 8.0.0.10/9 74.40.7.36
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ