n回発生する文字列ごとにテキストファイルをフィールド(列)に保存します。

n回発生する文字列ごとにテキストファイルをフィールド(列)に保存します。

Ciscoファブリック設定のExcelスプレッドシートを作成しており、インポートするフィールド/列に直接書式を適用したいと思います。

もちろん、修正された情報を含む形式は次のとおりです。

zone name Zone1_HOSTNAME01 vsan XXX
  fcalias name STORAGEPORT_0 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_1 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_2 vsan XXX
    pwwn xx:xx:xx:xx:xx

zone name Zone2_HOSTNAME02 vsan XXX
  fcalias name STORAGEPORT_3 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_4 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name HOSTNAME02 vsan XXX
    pwwn xx:xx:xx:xx:xx

したがって、私が望むのは、ゾーン名ZONE NAMEのすべての内容を1フィールドの「vsan」スペースに含めてから、「zone name」を含む行の先頭が表示されるまで各文字列を独自のフィールドに入れることです。その後、区切り文字を使用して必要なものを取得できます。だから本質的に私が最終的に欲しいものは次のとおりです。

"zone name Zone1_HOSTNAME01" "vsan" "XXX" "fcalias name" "STORAGEPORT_0 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_1 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_2 vsan XXX" "pwwn xx:xx:xx:xx:xx"

またはそのようなもの。後で列をより簡単に操作できるため、各スペースは独自のフィールドに配置できます。

テキストファイルは800行を超え、一部は大きくなるかもしれませんが、明確ではありません。最大の問題は、「Area Name....」で始まる最初の行の後に続くテキストが異なる可能性があるため、次のものに関係なくそのフィールドに翻訳するだけです。

ベストアンサー1

次のスクリプトはフィールド内にスペースがあるため、perlタブ区切り形式()で入力ファイルを出力します。markizy.txt

#!/usr/bin/perl

while(<>) {
  chomp;
  s/ +(vsan|fcalias|pwwn) */\t$1 /g ;
  s/ +\t/\t/;

  if ($. > 1 && m/^zone name/) {
    print $l,"\n";
    $l = $_;
  } elsif (eof) {
    $l .= $_;
    print $l,"\n";
  } else {
    $l .= $_;
  };
};

perl$.組み込み変数は現在行番号なので、スクリプトは入力の最初の行にあるときに印刷(空白行)を防ぎます。この変数と他の多くの変数(およびforなどの長いエイリアス)の詳細については、参考zone name資料を参照してください。man perlvar$INPUT_LINE_NUMBER$.

ファイルとして保存し、 を使用して実行可能にしてchmod +xから実行します。たとえば、cat -Tタブ(^I)を表示します。

$ ./markizy.pl markizy.txt  | cat -T
zone name Zone1_HOSTNAME01^Ivsan XXX^Ifcalias name STORAGEPORT_0^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_1^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_2^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx
zone name Zone2_HOSTNAME02^Ivsan XXX^Ifcalias name STORAGEPORT_3^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_4^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name HOSTNAME02^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx

パイピングを行うと、cat -T出力にタブ区切りのフィールドがあることがわかります(それ以外の場合は空白と大きく変わらないため)。実際に実行するときは使用しないでファイルにリダイレクトしてください。 Excel(または他のgnumericほとんどLibre Office Calcすべてのスプレッドシート)は、タブ区切りのテキストファイルをインポートするのに問題はありません。これは私が覚えている限り、ほぼ長い間標準的な機能でした。

実際に実行するには:

./markizy.pl markizy.txt > markizy.csv

インポート時にデータがコンマで区切られず、タブで区切られていることをExcelに通知する必要があります。それ以外の場合は、その事実を検出できます。

あるいは、データフィールドにコンマが含まれていないと確信している場合は、スクリプト内の\tすべてのsをコンマで置き換えてカンマで区切ることもできます。

おすすめ記事