[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 如何将当前目录下所有文本文件合并为一个然后按指定行数分割成一若干文本文件

本帖最后由 pcl_test 于 2016-9-21 13:06 编辑

比如像这样。。
1.txt的内容:
1
2
3
……………………
102

2.txt:

1
2
3
4
……………………
201

输出是这样..
out1.txt:
1
2
3
…………
100

out2.txt:
101
102
1
2
3
4
………………
98

out3.txt:
99
100
101
………………
198

out4.txt

199
200
201

  1. @echo off&setlocal enabledelayedexpansion
  2. set m=1
  3. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  4.   for /f "usebackq delims=" %%b in ("%%a") do (
  5.     set/a n+=1
  6.     echo,%%b>>out!m!.txt
  7.     if "!n!"=="100" set/a m+=1&set n=
  8.   )
  9. )
复制代码
试试

TOP

  1. copy *.txt temp.txt
  2. gawk "{print >\"result\" int((NR-1)/100)+1 \".txt\"}" temp.txt
  3. del temp.txt
复制代码
看得多说得多,远比不上写得多。

TOP

本帖最后由 broly 于 2012-6-10 19:25 编辑

回复 3# weichenxiehou
    copy有个地方不是很好,如果一个文本结尾没有换行,去合并另一个文本,那么第二个文本会接着第一个文本末尾开始,而不会另起一行。用more或者type好点
---学无止境---

TOP

本帖最后由 weichenxiehou 于 2012-6-10 20:09 编辑

回复 4# broly
这个问题确实需要考量,谢谢提醒。
我的解决办法为:
  1. gawk "{print}" *.txt >temp.txt
  2. gawk "{print >\"result\" int((NR-1)/100)+1 \".txt\"}" temp.txt
  3. del temp.txt
复制代码
当然也可以用sed:
  1. sed "" *.txt>temp.txt
复制代码
版主说可以考虑用type或more,关于more我不知道如何用,请指教。猜测type这样用?
  1. ::为了避免可能将结果文件卷入,没有取.txt的扩展名
  2. (for /f "delims=" %%i in ('dir/b *.txt') do type %%i)>temp
复制代码
不过这样依然会出现文件末无法换行的情况,请测试。
如果是直接type *.txt>temp.txt的话,会卷入一些文件名和空行,又增加问题额复杂性。
看得多说得多,远比不上写得多。

TOP

本帖最后由 poter 于 2012-6-10 20:15 编辑

我没测试过,不知道对不对~~

@echo off
setlocal enableDelayedExpansion
(for /f %%i in ('dir /b *.txt') do (
        type %%i
))>>new.txt
for /f %%i in (new.txt) do (
        set /a a+=1&set c=1
        set /a b=!a!%%100
        if "!b!"=="0" set /a c+=1
        echo %%i>>out!c!.txt
)

TOP

回复 5# weichenxiehou


    more的用法跟type差不多。你把代码里面的 type改为more即可。

如果用type,后面加&echo.   ,输出的时候再用 gawk过滤了空行就行。
只用gawk的那个代码也行啊。
---学无止境---

TOP

返回列表