标题: [文本处理] [已解决]批处理怎样平均每300行文字另外生成一个txt的文本? [打印本页]
作者: 逆流而上的熊猫 时间: 2015-2-9 14:34 标题: [已解决]批处理怎样平均每300行文字另外生成一个txt的文本?
本帖最后由 逆流而上的熊猫 于 2015-5-22 01:32 编辑
比如一个txt文本里面有三万行文字,批处理之后将三万行文字,平均每300行文字另外生成一个txt的文本,分完为止。分成之后txt文件名为1-100这样命名!麻烦大牛帮忙
作者: pcl_test 时间: 2015-2-9 16:04
本帖最后由 pcl_test 于 2015-2-9 16:53 编辑
回复 1# 逆流而上的熊猫
假设有文档test.txt- @echo off&setlocal enabledelayedexpansion
- set n=1
- set m=1
- for /f "delims=" %%i in (test.txt) do (
- if "!n!" neq "300" (
- >>!m!.txt echo %%i
- set /a n+=1
- ) else (
- >>!m!.txt echo %%i
- set n=1
- echo 第!m!组文档已生成。。。
- set /a m+=1
- )
- )
- pause
复制代码
作者: 逆流而上的熊猫 时间: 2015-2-9 16:13
回复 2# pcl_test
好用谢谢 :lol
作者: c755731262 时间: 2015-2-10 10:36
- @echo off&color f0&setlocal enabledelayedexpansion
- set /a n=0,m=1
- for /f "delims=" %%i in (test.txt) do (
- set /a n+=1
- if !n! leq 300 (
- echo %%i>>!m!.txt
- if !n! == 300 (
- echo 第!m!组已生成
- set /a m+=1,n=0
- )
- )
- )
- pause
复制代码
回复 1# 逆流而上的熊猫
作者: 愤怒的CMD 时间: 2015-2-10 14:04
这个问题用gawk怎么写代码呢?
作者: 慕夜蓝化 时间: 2015-2-10 15:51
- @echo off&setlocal enabledelayedexpansion
- set/a a=0,n=300,v+=1
- for /f "delims=" %%i in (a.txt) do (
- set/a a+=1
- if !a! leq !n! (>>!v!.txt echo,%%i) else (set/a n+=300,v+=1&>>!v!.txt echo,%%i)
- )
- pause
复制代码
作者: CrLf 时间: 2015-2-10 17:10
回复 6# 愤怒的CMD
gawk 可以像这样:- gawk -v count=300 "{N=FNR-1;print>int(N/count+1) \".txt\"}" 测试.txt
复制代码
作者: yiwuyun 时间: 2015-2-10 17:26
感觉用sed有点难写样。
作者: 愤怒的CMD 时间: 2015-2-10 19:24
回复 8# CrLf
谢谢帮助,学习一下。
作者: CrLf 时间: 2015-2-10 21:05
回复 9# yiwuyun
sed 不支持变量,所以无法完全靠 sed 实现,这里给个例子,最大支持 30000 行:- @echo off&setlocal enabledelayedexpansion
- (for /l %%a in (1 1 100) do (
- set /a n=%%a*300
- echo !n!,~300w %%a.txt
- ))>sed.script
-
- sed -n -f sed.script 测试.txt
复制代码
作者: yiwuyun 时间: 2015-2-10 22:46
谢谢,很好。学习了。看来还是gawk更高一层,支持变量。
作者: CrLf 时间: 2015-2-10 23:15
回复 12# yiwuyun
awk 可算是 perl 他爹啊,必须强大。
sed 的强大在于用简短而晦涩的指令高度概括最经常用到的行操作,在 shell 里用起来爽爆,简直可以盲打。
但简短快速的同时也失去了对更精细功能的支持,这就是为什么在 sed 里最强大的用法几乎都是倒腾正则和那两个空间,而在 awk 里貌似没有哪个东西是缺了它就不行的
个人见解,如有偏颇欢迎指正
作者: CrLf 时间: 2015-2-10 23:35
也可以用 gnu 命令 split:- @echo off
- split -l 300 a.txt splittxt_
- (for /l %%a in (1 1 1000) do ren splittxt_* %%a.txt) 2>nul
- pause
复制代码
作者: 凡凡之呗 时间: 2015-2-11 11:31
你们都没有做实验就把代码写出来了??高手啊
作者: yiwuyun 时间: 2015-2-11 15:56
本帖最后由 yiwuyun 于 2015-2-11 16:08 编辑
回复 11# CrLf
经过思考,借签你的想法。可以用纯sed来实现,但需要多次使用sed,前面的sed本质上是构建一个sed.script以便最后一个sed使用。不多说,上代码,欢迎修改,指正。共同进步- 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,以至于,有一行重复。这个要修改应该也行,只是代码就更长了。
作者: CrLf 时间: 2015-2-12 00:35
回复 16# yiwuyun
奇思妙想,nice!
那个多余的 p 可以这样去掉:- sed -n "=" a.txt|sed -n "1~6H;${g;p}"
复制代码
或者这样:- sed -n "=" a.txt|sed -n "${p;q};1~6p"
复制代码
作者: CrLf 时间: 2015-2-12 02:34
回复 16# yiwuyun
借兄台代码,改写成这样就没问题了,思路不变:- sed -n "$=;$q;0~6=;1~6=" a.txt|sed -nr "N;s/\n(.*)/,\1w/;p"|sed -n "p;="|sed -r "N;s/\n(.*)$/\1.txt/"|sed -nf - a.txt
复制代码
这个思路下还能继续简化吗...
作者: yiwuyun 时间: 2015-2-12 12:04
很好, sed造诣够深的,佩服,学习了。对最后一行的处理可能还需要冗余一下。要不然最后一行可能丢失。- sed -n "$=;$q;0~6=;1~6=" a.txt|sed -nr "${h;G;s/\n(.*)/,\1w/;p};N;s/\n(.*)/,\1w/;p"|sed -n "p;="|sed -r "N;s/\n(.*)$/\1.txt/"|sed -nf - a.txt
复制代码
作者: CrLf 时间: 2015-2-12 21:35
回复 19# yiwuyun
感谢提醒,不过你想复杂了,其实 sed 的 N 在碰到 $ 时,会阻止后面的指令,所以行数若为奇数行,最后一行是不会被输出的
简单把复制代码
改成- sed -n "${=;=;q};0~6=;1~6="
复制代码
就可以了
完整的就是- sed -n "${=;=;q};0~6=;1~6=" a.txt|sed -nr "N;s/\n(.*)/,\1w/;p"|sed -n "p;="|sed -r "N;s/\n(.*)$/\1.txt/"|sed -nf - a.txt
复制代码
作者: terse 时间: 2015-2-13 12:35
本帖最后由 terse 于 2015-2-13 12:37 编辑
回复 20# CrLf
我试下这样也可以
反正最后行始终打印行号复制代码
作者: CrLf 时间: 2015-2-13 14:03
回复 21# terse
也是,哎呀好暴力
作者: pcl_test 时间: 2015-5-21 21:53
如果问题已解决,请在标题最前面标上[已解决]
http://www.bathome.net/thread-3473-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |