[英]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.