Text-Processing

在文本文件中查找特定模式並將其從輸出中排除?

  • February 21, 2018

我有一個大約 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刪除該記錄中所有以 * 開頭的行後是否還有任何行,如果是,則列印該記錄。第三行刪除分隔每條記錄的空白行。

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