文本文件到欄位(列)每隔 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 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_NUMBER
for$.
)的詳細資訊,請參閱。將其保存到文件中,使用 使其可執行
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 替換為逗號,您將使用逗號分隔。