こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

教えてくださいm(_ _)m

最初に目的を書きます・・・
~test.txt~
1,aaa,eee,ttt
3,eee,eee,yyy
5,ttt,yyy,eee
2,yyy,bbb,qqq

5,ttt,yyy,eee
2,yyy,bbb,qqq
~~~~~~~~~~

例1)、カンマ区切り3列目が「eee」
の行を全て削除(完全一致)

例2)、カンマ区切り3列目が「e」を含む
行を全て削除(部分一致)

というふうにしたいのですが、
どのようにするのかわからないです・・・

現在下記のように
とりあえず1行目(0番目)を削除するとこまできました。

#! /usr/bin/perl

$TEST = 'test.txt';

open(FILE, "<$TEST");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;

$NO = 0;
splice @DATA, $NO, 1;

open(FILE, ">$TEST");
eval{ flock(FILE, 2) };
print FILE @DATA;
close FILE;

投稿日時 - 2017-04-28 15:51:04

QNo.9322838

困ってます

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

ササッと書いたので動くかどうかわかりませんが、
こんな感じです。

# 行位置補正のための変数
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++;
}
}

投稿日時 - 2017-04-29 12:27:05

お礼

ありがとうございます!

実行確認できました!

投稿日時 - 2017-05-02 08:48:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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;
}
}
と同じことです。

投稿日時 - 2017-05-02 10:48:47

お礼

お返事が遅くなり申し訳ございません。

確認実行できました。

まだ、ワンライナーについて、理解できていないので、
勉強していきます!

投稿日時 - 2017-05-08 09:09:30

ANo.2

ワンライナーで。
perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt

-i.bak はバックアップを取るオプションです。test.txt.bak に現在のファイルを保存します。試すとき -i.bak をつけなければ、標準出力に出力します。

投稿日時 - 2017-04-29 12:27:05

補足

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

ワンライナーというのを使ったことがないのですが、
質問文ですと

$NO = 0;
splice @DATA, $NO, 1;

これを

perl -i.bak -F, -ane 'print if$F[2]!~/^eee$/' test.txt

に替えるのでしょうか。。。?

試しに、コマンドラインで実行しましたがエラーです。
(使い方をわかっていないです・・・)

投稿日時 - 2017-05-02 08:52:22

お礼

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

投稿日時 - 2017-05-02 08:49:15

あなたにオススメの質問