• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PERL カンマ区切り 一致行削除)

PERL カンマ区切り 一致行削除

このQ&Aのポイント
  • PERLを使用して、カンマ区切りのファイルから特定の条件に一致する行を削除する方法を教えてください。
  • 例えば、カンマ区切りの3列目が「eee」の行を削除したい場合や、3列目が「e」を含む行を削除したい場合など。
  • 現在は、一行目を削除するまでの処理まで実装していますが、どのようにすれば特定の条件に一致する行を削除できるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • kichi8000
  • ベストアンサー率41% (660/1584)
回答No.1

ササッと書いたので動くかどうかわかりませんが、 こんな感じです。 # 行位置補正のための変数 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++; } }

perlhogehoge
質問者

お礼

ありがとうございます! 実行確認できました!

その他の回答 (2)

回答No.3

> ワンライナーで。 > 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; } } と同じことです。

perlhogehoge
質問者

お礼

お返事が遅くなり申し訳ございません。 確認実行できました。 まだ、ワンライナーについて、理解できていないので、 勉強していきます!

回答No.2

ワンライナーで。 perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt -i.bak はバックアップを取るオプションです。test.txt.bak に現在のファイルを保存します。試すとき -i.bak をつけなければ、標準出力に出力します。

perlhogehoge
質問者

お礼

ご回答ありがとうございます。

perlhogehoge
質問者

補足

ご回答ありがとうございます。 ワンライナーというのを使ったことがないのですが、 質問文ですと $NO = 0; splice @DATA, $NO, 1; これを perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt に替えるのでしょうか。。。? 試しに、コマンドラインで実行しましたがエラーです。 (使い方をわかっていないです・・・)

関連するQ&A