- ベストアンサー
unix 抽出して表示する方法
ファイル内に下記文字があるとして、 例:「1234@56789@0000000 11@56789@11@@11111@」 ここから、2個目の@の左3つを抜き出して表示させるには、 どうしたらいいでしょうか? 答えが1、2行目とも「789」と出力させたいです。 # awkだと指定の文字間丸々抜き取ってしまうし、cut?だと左から何文字とかだから・・・ # 苦戦中です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
失礼しました。-pe を -ne にしてください cat ファイル | perl -ne 'print "$1\n" if /@.*?([^@]{3})@/' この呪文、もといコマンドは 正規表現を使ってファイルから必要な部分のみを切り出す定番の処理です。 で、「2個目の@の左3つを抜き出す」を表す正規表現 /@.*?([^@]{3})@/ ですが、解説すると以下の様になります。 @ ← '@'が1文字(1個目の@) .*? ← 任意の0からn文字、ただし必要最小限に ( ← ここからを、後で$1として参照する [^@]{3} ← '@'でない3文字 ) ← ここまでを、後で$1として参照する @ ← '@'が1文字(2個目の@) わかりづらくてすみません。
その他の回答 (3)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
Perlが使えるのなら、Perlになれたほうが良いでしょうね。伝統的な UNIX の正規表現( http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#.E4.BC.9D.E7.B5.B1.E7.9A.84.E3.81.AA_UNIX_.E3.81.AE.E6.AD.A3.E8.A6.8F.E8.A1.A8.E7.8F.BE )がさらに拡張されていて、様々な局面で使えるでしょう。 No.1で示した正規表現は ^\d+\@\d*(\d{4})\@.*$ ^ : 先頭 \d : 数字 + : 一個以上 \@ : @は特別な意味を持つので\でエスケープ \d : 数字 * : ゼロ個以上 () : 取り出す部分 $1 $2・・で順番に \d : 数字 {4}: 4個 範囲を示すときは{2,4}2~4個 \@ : @ . : すべての文字 $ : 行末 ★^(行頭)を入れることで確実に先頭から二つ目の@を特定しています。一行に沢山@があると他でもマッチする可能性があるので・・$も同じ理由 数字以外も含まれるなら ^[^@]+\@[^@]*(\d{4})\@.*$ [^]は、その文字以外と言う意味 山12ほげ34@56789@0000000 1富士abc1@56789@11@@11111@ へな234---@56789@0000000@5365@8939@45 でも確実に二つ目の@直前の数字を拾える。 ★Perlが使えるならスクリプトを書いてコマンドラインから実行するほうが楽かも 一行目はperlへのパス which perl で確認しておく #!/usr/bin/perl use strict; open(IN, "< test.txt") or die("Error"); open (OUT,">abc.txt"); my $key = ""; my $num = 4; # 4個拾う while(my $line = <IN>){ chomp($line); if($line =~ /^[^@]+\@[^@]*(\d{$4})\@.*$/){ print OUT "$1\n"; } else{ next; } } close OUT; close IN; __END__ コマンドプロンプトから % chmod +x test.pl % test.pl でabc.txt にかき出される。
お礼
遅くなりましたが、perlについて別途勉強させていただきます。 今回は私の理解が乏しいため、ベストアンサーは別の方にいたしました
- Ogre7077
- ベストアンサー率65% (170/258)
perl を使えば簡単かと cat ファイル | perl -pe 'print "$1\n" if /@.*?([^@]{3})@/' 2個目の@の前は必ず@でない3文字がある前提です。 なので、以下の挙動になりますのでご了承ください。 1234@56@789 → 出力なし 1234@56@789@000 → 789
補足
・・全く何をしているかわかりませんが(呪文?笑)、出来ました! ただ、元の表示は出力させないようにはできないのでしょうか?? 789 1234@56789@0000000 ←いらない 789 11@56789@11@@1111 ←いらない
- ORUKA1951
- ベストアンサー率45% (5062/11036)
正規表現は数字からなる文字列でしたら 1234@56789@0000000 11@56789@11@@11111@ ^\d+\@\d*(\d{4}\@.*$ で後方参照 $1 とかで・・
お礼
perlについて自身の知識不足により2度もご回答いただきましてありがとうございます。