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をコンマで置き換えてカンマで区切ることもできます。
答え2
答え3
明らかに、一部のフィールドは、ソートされたデータをインポートした後にExcelによって生成される文字列で考慮されるため、省略することができます。より良いオプションがあると確信していますが、これは私の出力をすべて占有し、すべての値を新しい行に順番に配置し、vsan | pwwn | 'zone name' | fcaliasに不要なフィールドを削除して葉を残します。 me ゾーンとメンバーのエイリアスと pwwn エントリーだけが必要です。また、すべての領域が大文字Zで始まるので、より簡単になります。
1行に使用するコードは次のとおりです。
grep -oP '\S+' switch01-zones-20160711 | grep -Ev 'name|vsan|^01|^02|fcalias|pwwn|zone' | awk '{printf "%s%s", (/^Zone/?rs:FS), $0; rs=RS} END{print ""}' >to-import.csv
これにより、各地域のクールな単一行と文字列を作成するためにExcelにインポートされたリンクされたwwwデバイスのメンバーエイリアスが短時間に残りました。