- ベストアンサー
PERL カンマ区切り 一致行削除
- PERLを使用して、カンマ区切りのファイルから特定の条件に一致する行を削除する方法を教えてください。
- 例えば、カンマ区切りの3列目が「eee」の行を削除したい場合や、3列目が「e」を含む行を削除したい場合など。
- 現在は、一行目を削除するまでの処理まで実装していますが、どのようにすれば特定の条件に一致する行を削除できるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ササッと書いたので動くかどうかわかりませんが、 こんな感じです。 # 行位置補正のための変数 my $fix = 0; foreach my $NO(0 .. $#DATA){ my @strlist = split(/,/, $DATA[$NO - $fix]); my $test = $strlist[3]; chomp($test); $test =~ s/^ *(.*?) *$/$1/; if ($test =~ /^eee$/){ # 正規表現は 例1)/^eee$/ または、例2)/e/ # 行位置がずれるので本当は別の@変数を編集したい splice @DATA, $NO - $fix, 1; $fix++; } }
その他の回答 (2)
- donttalktome
- ベストアンサー率83% (10/12)
> ワンライナーで。 > perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt > > -i.bak はバックアップを取るオプションです。test.txt.bak に現在のファイルを保存します。試すとき -i.bak をつけなければ、標準出力に出力します。 ワンライナーとはコマンドラインのオプションだけで 完結するスクリプトのことです。 -F, オートスプリットの区切りを , にする -a オートスプリットする($_ をsplit して @F に代入) -n 与えるファイルを一行ずつ読み込む(while(<>){} と同じ) -e 次の引数をスクリプトとして評価する 'print if$F[2]!~/^eee$/' @F の2番目の要素が eee でなかったら、$_ を印字 つまり、 while(<>) { my @F = split ','; if ($F[2] !~ /^eee$/) { print; } } と同じことです。
お礼
お返事が遅くなり申し訳ございません。 確認実行できました。 まだ、ワンライナーについて、理解できていないので、 勉強していきます!
- donttalktome
- ベストアンサー率83% (10/12)
ワンライナーで。 perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt -i.bak はバックアップを取るオプションです。test.txt.bak に現在のファイルを保存します。試すとき -i.bak をつけなければ、標準出力に出力します。
お礼
ご回答ありがとうございます。
補足
ご回答ありがとうございます。 ワンライナーというのを使ったことがないのですが、 質問文ですと $NO = 0; splice @DATA, $NO, 1; これを perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt に替えるのでしょうか。。。? 試しに、コマンドラインで実行しましたがエラーです。 (使い方をわかっていないです・・・)
お礼
ありがとうございます! 実行確認できました!