Text-Formatting

文本文件到欄位(列)每隔 n 次出現的字元串

  • April 18, 2019

我正在創建 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 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 多行,有些可能更大,但現在還不得而知。最大的問題是,以“區域名稱….”開頭的初始行之後的文本可能會有所不同,因此無論接下來發生什麼,我只需要將它們翻譯成自己的欄位。

以下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內置變數是目前行號,因此腳本在輸入的第一行時$.避免列印(空行) 。zone name有關man perlvar此變數和許多其他變數(以及它們的冗長別名,例如$INPUT_LINE_NUMBERfor $.)的詳細資訊,請參閱。

將其保存到文件中,使用 使其可執行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(或gnumericLibre Office Calc或幾乎任何其他電子表格)在導入製表符分隔的文本文件時應該沒有困難——從我記事起,它幾乎就是一種標準功能。

真正執行它:

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

您可能必須告訴 Excel,數據在導入時是製表符分隔的,而不是逗號分隔的,或者它可能能夠自己檢測到這一事實。

或者,如果您絕對確定所有數據欄位都不會包含逗號,請將\t腳本中的所有 s 替換為逗號,您將使用逗號分隔。

引用自:https://unix.stackexchange.com/questions/293335