Linux下按指定次数的//分隔符拆分大文件(保留末尾//)
按指定次数的
//分隔符拆分文件(保留末尾分隔符) 我之前刚好碰到过几乎一模一样的需求,在Linux下处理文本拆分,要求按//的第N次出现分割,还得保证每个拆分后的文件末尾都保留//。下面给你两种经过验证的实用方法,都能完美满足你的需求:
方法一:用Awk实现(推荐,灵活易读)
Awk是处理这类文本分割任务的利器,我们可以通过统计//的出现次数,每累计到指定的N次就输出到新文件,同时确保最后剩余的内容也能生成对应的文件。
示例代码(N=2的情况)
假设你的输入文件是input.txt,要按每2次//出现拆分,执行下面的命令:
awk -v N=2 ' { # 把当前行加入缓冲区,避免单行内有多个//的情况 buffer = buffer $0 "\n" # 统计当前行中//的出现次数,累加到总计数里 count += gsub(/\/\//, "&") # 当累计次数达到N时,输出到文件并重置缓冲区和计数 while (count >= N) { file_num++ # 匹配前N个//对应的完整内容(包括最后一个//) match(buffer, /((.*?\/\/){'N'})/) print substr(buffer, 1, RLENGTH) > "chunk" file_num ".txt" # 截取剩余内容作为新的缓冲区 buffer = substr(buffer, RLENGTH + 1) count -= N } } END { # 处理最后剩余的内容,哪怕不足N次//,只要有内容就输出 if (buffer != "") { file_num++ print buffer > "chunk" file_num ".txt" } }' input.txt
代码说明
- 用
-v N=2指定拆分的次数,你可以改成任意需要的数字(比如N=3) buffer用来暂存还没输出的内容,避免单行内包含多个//导致拆分出错gsub(/\/\//, "&")会返回当前行中//的出现次数,自动累加到count变量match函数配合正则((.*?\/\/){N})精准匹配前N个//对应的完整内容,确保每个chunk末尾保留//- END块专门处理最后剩下的内容,哪怕不足N次
//,只要还有内容(包括末尾的//)就生成最后的chunk文件
测试你的示例输入
如果input.txt内容是:
ABC BCDV // EFGF HIJ KLMDF // NOP sdsd sd sdvsd sdsdsd dwe // er re er DFer er // DFGHDF //
执行上面的命令后,会生成3个文件:
chunk1.txt:ABC BCDV // EFGF HIJ KLMDF //(末尾的//完整保留)chunk2.txt:NOP sdsd sd sdvsd sdsdsd dwe // er re er DFer er //chunk3.txt:DFGHDF //
完全符合你的要求!
方法二:用Shell脚本+Sed实现
如果你更习惯用基础的Shell工具,也可以结合Sed来实现,核心思路是先给每个第N次出现的//标记特殊分隔符,再用split拆分,最后清理标记并确保末尾保留//。
示例脚本(N=2)
#!/bin/bash N=2 INPUT_FILE="input.txt" # 给每第N个//添加特殊拆分标记 sed -E "s/(.*?\/\/.*?\/\/)/\1###SPLIT###/g" "$INPUT_FILE" | \ # 按标记拆分文件,生成chunk00、chunk01这类命名的文件 split -d -p "###SPLIT###" - "chunk" # 遍历拆分后的文件,清理标记并检查末尾的// for file in chunk*; do sed -i 's/###SPLIT###//g' "$file" # 可选:如果文件末尾没有//,补充(你的示例输入末尾有//,这步可省略) if ! grep -q "//$" "$file"; then echo "//" >> "$file" fi done
注意事项
- 部分老版本的Sed可能需要用
sed -r代替sed -E来启用扩展正则支持 - 拆分后的文件名是
chunk00、chunk01格式,你可以修改split的参数调整命名规则
内容的提问来源于stack exchange,提问作者Dixon MD
相关产品推荐
相关产品推荐

