あなたの映画力を試せる!POPLETA映画検定(無料) >>

以下のようなデータで、同じ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件)

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

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


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

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


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

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

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


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

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

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QPerlのプログラミングに困っています。

Perlでプログラムを書いています。
整数を1個受け取ってその整数の数だけコマンドプロンプト上に*の記号を使って縦横に左上の向きの直角三角形を表示させる方法はどのようにやるのでしょうか。
例えば「5」という数字を受け取った場合は
*****
****
***
**
*
のように表示させたいです。
宜しくお願いします。

Aベストアンサー

あなたのソースを多少修正しました。
以下のようにしてください。
---------------------------------------------
print '正整数を入力して下さい: ';
$n = <STDIN>;
chomp($n);

while ($n > 0) {
$y = $n;
while ($y > 0) {
print "+";
$y--;
}
print "\n";
$n--;
}

Q[perl] next と return 同じ意味で使えますか?

数年間とりあえず普通に動いている自作のプログラムを眺めていたらおかしな部分を見つけました。これは修正しないでそのまま使えますか?
また、このプログラムを見て疑問に思ったのですが、★の部分、nextとreturnはどちらでもこの場合同じ挙動になりますか?
なお、以下コードをテストして見る限り同じような挙動に見えます。


use strict;
$| = 1;
for(1..50){
print ;
&Test($_);
sleep 1;
}
sub Test(){
my $a = shift @_;
for(1..2){
print ".";
}
if($a % 2 == 0){
print "2";
# next; #★
# return ; #★
}
print "*\n";
}

Aベストアンサー

通常は使えません。
next は「現在のループを中段して次のループへ移動する」もの
returnは「現在の関数を終了して呼び出し側に戻る」もの
と、動作はまったく違います。

http://perldoc.jp/func/next%20LABEL
> ブロック自身は一回だけ実行されるループと文法的に同一であることに 注意してください。
> 従って、next はそのようなブロックから早く抜けるのに使えます。

とあるので、

next で、 sub(){} のブロック(=1回だけのループ)の次のループに移行する
→ 2回目は無いのでループから抜ける(=sub(){}のブロックから抜ける=subを終了する)

という動作をしていて、見掛け上は subを終了する return と同じに見えるのでしょう。

ですが、

{
if($a % 2 == 0){
print "2";
# next; #★
# return ; #★
}
}
print "*\n";

と、一つブロックを深くすると
next : 一番違いブロックを抜ける: print "*\n"; が実行される
return : subを抜ける : print "*\n"; は実行されない
と違いが出てきます。

また
> next は eval {}, sub {}, do {} のように値を返す ブロックから抜けるのには使えません;

とマニュアルに書いてあります。
今回は値を返さないsubなので影響はありませんが。

通常は使えません。
next は「現在のループを中段して次のループへ移動する」もの
returnは「現在の関数を終了して呼び出し側に戻る」もの
と、動作はまったく違います。

http://perldoc.jp/func/next%20LABEL
> ブロック自身は一回だけ実行されるループと文法的に同一であることに 注意してください。
> 従って、next はそのようなブロックから早く抜けるのに使えます。

とあるので、

next で、 sub(){} のブロック(=1回だけのループ)の次のループに移行する
→ 2回目は無いのでループから抜ける(=sub(){}のブ...続きを読む

QC言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします

C言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします。

Aベストアンサー

画像じゃなく、テキストで貼ってほしいところですが…。
で、掲示されている範囲ではs_copy()とs_reverse()の仕様が不明です。
# まぁ、名前からだいたい想像は付きますけども。

ということで、下記のページをどうぞ。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13182921508

Qテキストファイルの結合について

お世話になります。
テキストファイルの結合方法について教えてください。
環境はwindows7です。
入っている言語は
ruby2.5
python3.5
が入っております。

現在とあるフォルダ内に
data1.dat
data2.dat

data8.dat
data9.dat
data10.dat
data11.dat
data12.dat

data18.dat
data19.dat
data20.dat
data21.dat
data22.dat

data28.dat
data29.dat
data30.dat
data31.dat

data38.dat
data39.dat
data40.dat
data41.dat

のようなテキストファイルがあります。
この中身を縦方向に全部結合したいなと思い
windowsの標準でできるかなと思い
コマンドプロンプトから
type *.dat > all.txt
と実施してやったところ、ファイルは見た目上結合されていました。
しかしながら、中身をのぞいてみますと、順番が崩れてしまっておりました。
どのようにかと言いますと
data1.dat
data10.dat
data11.dat
data12.dat

data18.dat
data19.dat
data2.dat
data20.dat
data21.dat
data22.dat

data28.dat
data29.dat
data3.dat
data30.dat
data31.dat

data38.dat
data39.dat
data4.dat
data40.dat
data41.dat
data5.dat
data6.dat
data7.dat
data8.dat
data9.dat
といった感じです。
ファイルの一桁のファイルがそれぞれの間に挿入されている感じだったので
02.dat,03.datとゼロを足してやれば望んだどおりにはなってくれました。

今回お聞きしたい内容としては
data1.datやdata2.datのファイル名称はそのままで、うまいこと結合する方法をお聞きしたく質問させていただきました。ファイル名が二桁までなら手でも修正できるのですが、ファイルが3ケタ4ケタまである場合は修正するだけで参ってしまいます。ファイルの出力する段階で名称を変えれればいいのですが、ソフトの設定に何桁出力(たとえばdata0001.dat)のように設定する箇所がないためちょっと困っております。

良い方法があったら教えてください。

お世話になります。
テキストファイルの結合方法について教えてください。
環境はwindows7です。
入っている言語は
ruby2.5
python3.5
が入っております。

現在とあるフォルダ内に
data1.dat
data2.dat

data8.dat
data9.dat
data10.dat
data11.dat
data12.dat

data18.dat
data19.dat
data20.dat
data21.dat
data22.dat

data28.dat
data29.dat
data30.dat
data31.dat

data38.dat
data39.dat
data40.dat
data41.dat

のようなテキストファイルがあります。
この中...続きを読む

Aベストアンサー

4桁数個もあるんだったら、ファイル結合ソフトを使ったほうが早いよ (^_^;

https://www.vector.co.jp/soft/winnt/util/se492130.html

https://www.vector.co.jp/vpack/filearea/winnt/util/file/spl_mrg

Qインタプリタ言語とスプリクト言語

インタプリタ言語とスプリクト言語の違いがいまいち分かりません。

分かる方よろしくお願いいたします。

Aベストアンサー

スクリプト言語
一般の利用者でも扱える程度に簡単で、短い台本(スクリプト)を書く目的で使われる様な、プログラミング言語の分類
技術者が使う様な、高機能ながら高難度な汎用言語と比べられる。

インタプリタ
ソースコードを、なんらかの翻訳作業をしながら実行する、処理系の分類
コンパイラ
ソースコードを、なんらかの翻訳作業をまとめて行い実行可能な形式を作り出す、処理系の分類

インタプリタ言語
とくにそのようなプログラミング言語の分類は無い
インタプリタ処理系で実行されることが一般的なプログラミング言語、ならばスクリプト言語が多く挙げられるが、
言語によって処理系が固定されることは通常あり得ない

Qこの写真のようになってしまうのは何故でしょうか?

この写真のようになってしまうのは何故でしょうか?

Aベストアンサー

該当のブツを試したことはありませんけども……。

https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code
内容的に細分化して、1つのGitリポジトリから分裂(?)している為、Adafruit-Raspberry-Pi-Python-Code.gitでは何も取得できないからじゃないですかね?

ADS1x15を使いたいなら…
https://github.com/adafruit/Adafruit_Python_ADS1X15
からではないでしょうか?
「Installation」のところに手順は書かれているので試してみてはどうでしょう?

Qphpとperl

phpとperl はどちらもapacheを使用しますが、同じPCの中でこれらすべてをインストールしてもよいですか。
phpの場合ーーーphp.iniを一部変更します。
perl の場合ーーーapacheの設定を変更します。

つまり同じapacheにおいて両方の変更をすることになりますが、問題はないのでしょうか

Aベストアンサー

共存可能です

「phpとapacheは無関係」と指摘された方もいますが
phpはapacheのモジュールとして動作する場合が多いので
あるいみapacheの機能の一つとみることができ、無関係というのは言いすぎです。

cgiとして動作させる場合はphpもperlもapacheから独立しているので
最低限の設定をすればよいでしょう

QRubyなどを使って検索できるプログラムを作りたい

下記のようなプログラムを作りたいと思っています。

1.氏名、住所、生年月日が登録できること。
2.氏名と住所があいまい検索できること。
3.生年月日が範囲検索できること。
4.2と3の検索結果を一覧表示できること。
  表示する項目は氏名、住所、年齢
5.4で表示した一覧から選択を行い修正ができること。

開発言語はHTML&CSS,JavaScript,Rubyの中から簡単に出来るもので作りたいです。

また、データの登録先はデータベースでもファイルでも構いません。
データベースの場合はPostgreSQLがいいと思っています。

その方法も教えて頂ければ幸いです。

プログラミングど素人なので、丸投げ的な感じになってしまい申し訳ありません。

作成するためのヒントを頂けるだけでも有り難いです。

宜しくお願い致します。

Aベストアンサー

>>開発言語はHTML&CSS,JavaScript,Rubyの中から簡単に出来るもので作りたいです。

ご希望のソフトをRubyで作りたいとしても、上記の言語をすべて理解する必要があります。
また、上記に加えて、たぶんjQuery、Bootstrapもマスターする必要があります。
もちろんデータ保存と検索処理があるから、データベース言語であるSQLもマスターしてください。
選択したデータベースに対応するデータベース管理の仕方もマスターしてください。
あと、Webサーバであるapacheかリバースプロキシーのnginxも勉強しましょう。

Qまちがっているところ

strSQL = " "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード, SUM(東京支店) AS TOKO"
strSQL = strSQL & " FROM"
strSQL = strSQL & " ( "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " *"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [3学期$] "
strSQL = strSQL & " UNION ALL "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " *"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [2学期$] "
strSQL = strSQL & " ) "
strSQL = strSQL & " GROUP BY 商品コード"
まちがっているところおしえてくれませんでしょうか

strSQL = " "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード, SUM(東京支店) AS TOKO"
strSQL = strSQL & " FROM"
strSQL = strSQL & " ( "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " *"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [3学期$] "
strSQL = strSQL & " UNION ALL "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " *"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [2学期$] "
strSQL = strSQL & " ) "
strSQL = strSQL & " GROU...続きを読む

Aベストアンサー

No.3です。

列数が一致しないとなっているならSheet構成がそれぞれで違うのではないですかね?(検証すると確かに列数が違うとエラーになる)

その場合それぞれのSheetでSELECTしたいフィールドを明確にする為に

strSQL = " "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード, SUM(東京支店) AS TOKO"
strSQL = strSQL & " FROM"
strSQL = strSQL & " ( "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード,東京支店" '★
strSQL = strSQL & " FROM"
strSQL = strSQL & " [3学期$] "
strSQL = strSQL & " UNION ALL "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード,東京支店" '★
strSQL = strSQL & " FROM"
strSQL = strSQL & " [2学期$] "
strSQL = strSQL & " ) AS 合計"
strSQL = strSQL & " GROUP BY 商品コード"

とフィールド名を記載したらエラーは消えましたよ。

No.3です。

列数が一致しないとなっているならSheet構成がそれぞれで違うのではないですかね?(検証すると確かに列数が違うとエラーになる)

その場合それぞれのSheetでSELECTしたいフィールドを明確にする為に

strSQL = " "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード, SUM(東京支店) AS TOKO"
strSQL = strSQL & " FROM"
strSQL = strSQL & " ( "
strSQL = strSQL & " SELECT "
strSQL = strSQL & " 商品コード,東京支店" '★
strSQL = strSQL & " FROM"
strSQL = strSQL & " [3学期$] "
...続きを読む

QPHPでの正規表現を使った文字列の取得について

preg_match_allを使って文字列を取得しようとしています。

$data = '<img src="abcdef">
<img src="あいうえお">';
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $data, $matches);
var_dump($matches);

$dataの形式?がこのような形だと思ったもの(「abcdef」と「あいうえお」)が取れるのですが、
$data = '<img src="abcdef"><img src="あいうえお">';
だと、取れません。
(たぶん、<img src="xxxx">のあとが改行されていないとダメなようです)

正規表現がよくわかっていなくて、これもネットで拾ったものです。
$dataは簡易的に書きましたが、実際は文章の中に複数の画像が差し込まれているものです。

どうすればうまく取れるのでしょう。
よろしくお願いします。

Aベストアンサー

デフォルトは最長一致です。最短一致にするには、「 .+? 」、「 .*? 」のように ? を追加します。

$output = preg_match_all('/<img.+?src=[\'"]([^\'"]+)[\'"].*?>/i', $data, $matches);


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング