簡體   English   中英

awk或sed命令將匹配正則表達式的大文本文件拆分為每個包含n條記錄的較小文件

[英]awk or sed command to split large text file matching a regex into smaller files each containing n records

我想根據匹配的正則表達式將文本文件拆分為多個文件。 這很簡單,使用awk。 例如,

tmp_file_prefix="f-" ; awk '/^ID:/{x="'"$tmp_file_prefix"'" ++i;} {print > x;}' file.txt

問題是,輸入文本文件“file.txt”的大小很大,精確到2.6 GB。 我敢肯定,我會快速耗盡目錄中的最大文件限制。

上面的awk命令很好地完成了我的工作,並將包含與正則表達式匹配的整個記錄​​的文件拆分為多個文件。 我已經在一個較小的文件上執行了命令,其中包含25個這樣的記錄,每個記錄都有不同的大 但我意識到這將超出目錄中max files的限制。

我嘗試了以下模式:

tmp_file_prefix="f-" ; awk -v i=0 '/^ID:/{x="'"$tmp_file_prefix"'" ++i;} i % 20 == 0 {print > x;}' file.txt

並意識到它只發出第20個模式並將其保存在文件中。 此解決方案不正確。

我想在上面說的awk命令中找到一種方法,我可以將源文件拆分成較小的文件,每個文件包含25000千(或者n為n)的正則表達式。

grep '^ID:' file.txt | split -l 25000

awk -v prefix="$tmp_file_prefix" -v max=25000 '
    function filename() { return sprintf(%s%06d", prefix, ++i) }
    !x { x = filename() }
    /^ID:/ {
        print > x
        n++
        if (n == max) {
            close x
            x = ""
            n = 0
        }
    }
' file

這不應該用完打開的文件句柄,因為它在完成后需要關閉文件。

您可以先使用split(1)將源文件拆分為較小的部分,然后在每個部分上運行awk腳本。 顯然你需要附加到輸出文件,而不是覆蓋它們!

split -l 25000 -a 3 file.txt

將生成文件xaaa,xaab,xaac等,每個不超過25000行,然后您可以使用您的awk腳本處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM