Text-Processing
在文本文件中查找特定模式並將其從輸出中排除?
我有一個大約 25000 行的文件。看看我的範例輸入和所需的輸出
輸入:
zone name tommy * pwwn xxxxxxxx pwwn xyzabcda * pwwn xcvuytnm zone name sammy * pwwn akslapsl * pwwn dfgsjasl * pwwn xcvuytnm zone name angelfalls * pwwn xxxxxxxx pwwn xyzabcda zone name Newyork * pwwn xxxxxxxx pwwn xyzabcda
期望的輸出:
zone name tommy * pwwn xxxxxxxx pwwn xyzabcda * pwwn xcvuytnm zone name angelfalls * pwwn xxxxxxxx pwwn xyzabcda zone name Newyork * pwwn xxxxxxxx pwwn xyzabcda
我希望輸出排除在 pwwn 之前的每一行中包含 * 的所有區域。在我的範例中,區域名稱 sammy 在所有三個 pwwn 行中都有一個 *,因此我排除了區域名稱 sammy 下的所有 * 行。
使用 solaris 5.10、Korn Shell。
**
Awk
**解決方案:awk '/^zone /{ if (f) print r; r = $0; f = 0; next } { r = r ORS $0; if (/^[^*]* pwwn/) f = 1; } END{ if (f) print r }' file
輸出:
zone name tommy * pwwn xxxxxxxx pwwn xyzabcda * pwwn xcvuytnm zone name angelfalls * pwwn xxxxxxxx pwwn xyzabcda zone name Newyork * pwwn xxxxxxxx pwwn xyzabcda
以下是我將如何作為快速 perl 管道執行此操作:
perl -p00e 's/\nzone/\n\nzone/g' inputfile \ | perl -n00e '$t = $_; s/^\*.*?\n//mg; print $t if /pwwn/' \ | perl -p00e 's/\n\n/\n/'
第一行在每條記錄之間添加一個空行。第二行遍歷每條記錄,檢查
pwwn
刪除該記錄中所有以 * 開頭的行後是否還有任何行,如果是,則列印該記錄。第三行刪除分隔每條記錄的空白行。