プロが教える店舗&オフィスのセキュリティ対策術

以下のようなデータで、同じClassのうちPositionの差が100以下の行は削除したいのですが、やり方がわかりません。
このようなデータがたくさんあり手作業では困難なため、Perlによる処理をしたいです。
スクリプトを教えてもらえないでしょうか。

入力データは以下の通りです。
Class Position
1 12
1 34
1 430
1 800
1 1000
1 1034
2 1
2 10
2 98
2 500
2 780


次の行とのPositionの差が<100だったら削除するみたいな感じで処理して
以下のような出力結果にしたいです。

Class Position
1 12
1 430
1 800
1 1000
2 1
2 500
2 780

ご教示いただけないでしょうか。

よろしくお願いいたします。

A 回答 (4件)

やり方(データ構造の作り方や使うループとかの種類)は様々ありますが。


基本構造はこのように書けると思われます。

my $array = [
[12, 34, 430, 800, 1000, 1034,],
[1, 10, 98, 500, 780,],
];

foreach my $class ( @$array ){
my $old = $class->[0] - 100;
foreach my $Position (@$class){
print $Position . "\n" if($Position >= $old + 100);
$old = $Position;
}
}
    • good
    • 0

1行目は見出し(Class Positionの文字)ですか。


それとも、いきなりデータ(1 12の文字)ですか。

データの区切りは、半角のスペースであってますか。
    • good
    • 0

標準入力からデータを読み込んで処理


my $clz = "";
my $pos = 0;
foreach (<>) {
my @a = split /\s+/;
print if $clz ne $a[0] || $pos + 100 < $a[1];
($clz,$pos) = @a;
}

ワンライナーで実行
cat ファイル | perl -ne 'BEGIN{$clz="";$pos=0;} @a = split /\s+/; print if $clz ne $a[0] || $pos + 100 < $a[1]; ($clz,$pos) = @a;'

標準入力以外から読み込むなら以下を参考
http://perldoc.jp/docs/perl/5.24.1/perlopentut.pod
    • good
    • 0

data.txtというテキストファイルが入力データである前提で…



open(R,"data.txt");
my $cl = 0;
my $pos = -100;
while(<R>) {
if(/(¥d+)¥D+(¥d+)/) {
if($1 != $cl) { $cl = $1; $pos = -100;}
if($2 - 100 > $pos) {
print " $1 $2¥n";
}
$pos = $2;
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!