別の目的で特定のデータと形式を抽出するためにデータファイルをどのように解析できますか?

別の目的で特定のデータと形式を抽出するためにデータファイルをどのように解析できますか?

さまざまな内容を含むデータファイルが与えられたら、まずIPアドレスで始まらない行を無視してからIPアドレスを出力し、その後に記号を含まない中括弧内の文字列を出力したいと思います=。指定された行には1つ以上の文字列を含めることができます。

たとえば、

入力する:

junk12  
junk34  
198.0.12.20 [ joker penguin character=villian ] blah  
198.0.13.20 [ super_man bat_man character=hero ] blah  
198.0.14.20 [ lois_lane character=damsel ] blah  
junk56  
junk78  

出力:

198.0.12.20 joker  
198.0.12.20 penguin  
198.0.13.20 super_man  
198.0.13.20 bat_man  
198.0.14.20 lois_lane  

答え1

これを行うにはいくつかの方法がありますが、awk次のことができます。

awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }'

これをもう少し読みやすいものに分けてみましょう。

gsub(/^[0-9.]+ \[ /,$1 " ") { .... }

これは数字とピリオドで始まり、その後にスペースとピリオドが続く行と一致します[。したがって、一致10.20.30.40 [が一致しませんjunk23。これを最初のフィールドに置き換えてから実行します{...}

だから、次の行

198.0.12.20 [ joker penguin character=villian ] blah  

次のセクションに進みます。

198.0.12.20 joker penguin character=villian ] blah  

これで中間部分が出てきます。複数行で書くと分かりやすくなります。

a=2;
while (a<=NR && $a != "]")
{
  if ($a !~ /=/) {print $1 " " $a }
  a++;
}

したがって、2番目のフィールド(この場合は「clown」)から始まり、単語が不足するか、またはが表示されるまで続けます]。見つかった単語ごとにanが含まれていない場合は、=Aフィールド(IPアドレス)を印刷して単語。

結果:

198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane

(おそらくこれより良い方法があるでしょう!)

関連情報