Gawk

每次出現正則表達式時如何拆分文件?

  • July 22, 2020

每次段落包含出現“7-04/PNLP-000001”形式的程式碼時,我都試圖讓 gawk 將文本文件拆分為不同的文件。因此,例如,如果原始文本文件包含以下內容:

第 7-04/PNLP-000009 號法律的提案號,與塞維利亞-科爾多瓦-馬德里大道線有關。

主席

提案第 7-04/PNLP-000001 號法律,關於恢復和改善安達盧西亞農村工人的權利和社會覆蓋面。

總統女士

我想獲得一個包含以下內容的文件:

第 7-04/PNLP-000009 號法律的提案號,與塞維利亞-科爾多瓦-馬德里大道線有關。

總統女士

另一個包含以下內容:

第 7-04/PNLP-000001 號法律提案,關於恢復和改善安達盧西亞農村工人的權利和社會覆蓋面。

總統女士

我正在嘗試使用此程式碼:

gawk '
       /^\n.+[0-9]\-[0-9]{2}\/.+\-[0-9]{6}$/
       {if (p) close (p)
       p = sprintf("split%05i.txt", ++i) }
           { print > p; }
   ' input.txt

但是,這只是每行創建一個文件,無論其內容如何。有誰知道我做錯了什麼?提前致謝!

你很接近:

awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ {
      if (file) close (file)
      file = sprintf("split%05i.txt", ++i)
    }
    file {print > file}' input.txt

您希望{ if... }為匹配模式的行執行程式碼塊[0-9]...,因此,它應該與/.../.

{print > file}只要file設置,第二個程式碼塊將針對每條記錄執行,file用作條件。

\n這裡使用您的模式沒有意義,因為awk依次處理的每個記錄都是每行的內容(因為預設記錄分隔符 ( RS) 是\n),因此記錄永遠不會包含換行符。您也不想在此處錨定您的正則表達式(^$)。

我已將您的替換.+[[:upper:]]+更具體的內容。例如,.+它會匹配上blah 5-10/2 blah blah €1000000。您可能需要根據要接受的內容來代替PNLP.

請注意,它也匹配 on ,因為它確實包含與模式匹配的字元串(參見粗體部分)。blah 123**4-56/XX-123456**7890 blah

我已經刪除了gingawk因為該程式碼不是gawk特定的。但是請注意,仍然有一些 awk 實現不支持上面的{2}/{6}運算符(即使這是 POSIX 要求),因此如果您知道gawk將可用,您不妨使用它來確保它可以正常工作。

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