找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 93857|回复: 21

[文本处理] [已解决]批处理怎样平均每300行文字另外生成一个txt的文本?

[复制链接]
发表于 2015-2-9 14:34:46 | 显示全部楼层 |阅读模式
本帖最后由 逆流而上的熊猫 于 2015-5-22 01:32 编辑

比如一个txt文本里面有三万行文字,批处理之后将三万行文字,平均每300行文字另外生成一个txt的文本,分完为止。分成之后txt文件名为1-100这样命名!麻烦大牛帮忙
发表于 2015-2-9 16:04:08 | 显示全部楼层
本帖最后由 pcl_test 于 2015-2-9 16:53 编辑

回复 1# 逆流而上的熊猫

假设有文档test.txt
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1
  3. set m=1
  4. for /f "delims=" %%i in (test.txt) do (
  5. if "!n!" neq "300" (
  6. >>!m!.txt echo %%i
  7. set /a n+=1
  8. ) else (
  9. >>!m!.txt echo %%i
  10. set n=1
  11. echo 第!m!组文档已生成。。。
  12. set /a m+=1
  13. )
  14. )
  15. pause
复制代码
 楼主| 发表于 2015-2-9 16:13:22 | 显示全部楼层
回复 2# pcl_test


    好用谢谢 :lol
发表于 2015-2-10 10:36:32 | 显示全部楼层
  1. @echo off&color f0&setlocal enabledelayedexpansion
  2. set /a n=0,m=1
  3. for /f "delims=" %%i in (test.txt) do (
  4. set /a n+=1
  5. if !n! leq 300 (
  6. echo %%i>>!m!.txt
  7. if !n! == 300 (
  8. echo 第!m!组已生成
  9. set /a m+=1,n=0
  10.                )
  11.                  )
  12. )
  13. pause
复制代码
回复 1# 逆流而上的熊猫
发表于 2015-2-10 14:04:04 | 显示全部楼层
这个问题用gawk怎么写代码呢?
发表于 2015-2-10 15:51:47 | 显示全部楼层

  1. @echo off&setlocal enabledelayedexpansion
  2. set/a a=0,n=300,v+=1
  3. for /f "delims=" %%i in (a.txt) do (
  4.     set/a a+=1
  5.     if !a! leq !n! (>>!v!.txt echo,%%i) else (set/a n+=300,v+=1&>>!v!.txt echo,%%i)
  6. )
  7. pause
复制代码
发表于 2015-2-10 17:10:06 | 显示全部楼层
回复 6# 愤怒的CMD


    gawk 可以像这样:
  1. gawk -v count=300 "{N=FNR-1;print>int(N/count+1) ".txt"}" 测试.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
愤怒的CMD + 1 你好厉害啊

查看全部评分

发表于 2015-2-10 17:26:57 | 显示全部楼层
感觉用sed有点难写样。
发表于 2015-2-10 19:24:58 | 显示全部楼层
回复 8# CrLf


    谢谢帮助,学习一下。
发表于 2015-2-10 21:05:51 | 显示全部楼层
回复 9# yiwuyun


    sed 不支持变量,所以无法完全靠 sed 实现,这里给个例子,最大支持 30000 行:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in (1 1 100) do (
  3.         set /a n=%%a*300
  4.         echo !n!,~300w %%a.txt
  5. ))>sed.script

  6. sed -n -f sed.script 测试.txt
复制代码
发表于 2015-2-10 22:46:15 | 显示全部楼层
谢谢,很好。学习了。看来还是gawk更高一层,支持变量。
发表于 2015-2-10 23:15:06 | 显示全部楼层
回复 12# yiwuyun


    awk 可算是 perl 他爹啊,必须强大。
    sed 的强大在于用简短而晦涩的指令高度概括最经常用到的行操作,在 shell 里用起来爽爆,简直可以盲打。
    但简短快速的同时也失去了对更精细功能的支持,这就是为什么在 sed 里最强大的用法几乎都是倒腾正则和那两个空间,而在 awk 里貌似没有哪个东西是缺了它就不行的
    个人见解,如有偏颇欢迎指正
发表于 2015-2-10 23:35:52 | 显示全部楼层
也可以用 gnu 命令 split:
  1. @echo off
  2. split -l 300 a.txt splittxt_
  3. (for /l %%a in (1 1 1000) do ren splittxt_* %%a.txt) 2>nul
  4. pause
复制代码
发表于 2015-2-11 11:31:35 | 显示全部楼层
你们都没有做实验就把代码写出来了??高手啊
发表于 2015-2-11 15:56:34 | 显示全部楼层
本帖最后由 yiwuyun 于 2015-2-11 16:08 编辑

回复 11# CrLf

经过思考,借签你的想法。可以用纯sed来实现,但需要多次使用sed,前面的sed本质上是构建一个sed.script以便最后一个sed使用。不多说,上代码,欢迎修改,指正。共同进步

  1. sed -n "=" a.txt|sed -n "1~6p;$p"|sed "N;s/^\(.*\)\n\1$/\1\n/;P;D;"|sed "/^$/d"|sed "$q;1!p;"|sed "N;s/^\(.*\)\n\(.*\)$/\1,\2w/"|sed "="|sed "N;s/\(.*\)\n\(.*\)$/\2\1.txt/"|sed -nf - a.txt
复制代码
这是每六行的代码,如果要改成其他数字,只需修改第一个sed的1~6为其他数字即可。有一点不足的是,没有实现第二个数字的减1,以至于,有一行重复。这个要修改应该也行,只是代码就更长了。

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 sed

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 03:58 , Processed in 0.012685 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表