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

[文本处理] 批处理如何从一个txt文本里随机提取指定数目的行添加到其它多个文本的末尾?

[复制链接]
发表于 2013-6-30 00:35:39 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-9-6 23:43 编辑

大家好,有个问题想请各位大神帮助解决

大致是这样的,
有101个TXT文件,其中有一个all.txt里有1000行,其它100个1.txt, 2.txt,...,100.txt,每个里面都是一篇小短文。
现在我想
每次随机从all.txt这1000行里取10行,添加到其它100个TXT文件中的某一个,直到这100个TXT文件每个都被添加过一次。
(每次随机抽取的10行数据可以有重复的行)

麻烦大神们帮帮忙,先谢谢各位了,祝大家开心快乐
发表于 2013-6-30 02:59:41 | 显示全部楼层
本帖最后由 terse 于 2013-6-30 12:25 编辑

没测试 1000个变量的效率
添加8行 >
休息

  1. @echo off&setlocal enabledelayedexpansion
  2. set m=1000
  3. for /f "delims=" %%i in (all.txt) do set /an+=1&set #!n!=%%i
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /ivx "all\.txt"') do (
  5.     (for /l %%a in (1 1 10) do (
  6.         set /a n=!random!%%m+1
  7.         for %%b in (!n!) do echo !#%%b!
  8.     ))>>"%%i"
  9. )
  10. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
yjqrsyg + 1 真厉害
needhelp + 1 谢谢

查看全部评分

 楼主| 发表于 2013-6-30 10:26:10 | 显示全部楼层
回复 2# terse


    谢谢 terse的帮助,我试了一下你给的代码,但是跟我想要的效果有点差别,应该是我之前的提问没说清楚,
我想要的结果是,把随机取得的10行添加到其它文本文件的最末,而不是把这些文本文件里的内容给替换成这10行随机的内容。
terse你给的代码是把原有的文本文件里的内容给替换成这10行随机的内容了,你能再帮忙改改吗? 谢谢了
发表于 2013-6-30 10:26:55 | 显示全部楼层
纯p这样的效率应该很高了吧。
可惜findstr的结果会自动排序,要不效率应该会快点。
m取值为n不是更合理,第8行应该追加吧 ))>>"%%i"

评分

参与人数 1技术 +1 收起 理由
needhelp + 1 谢谢

查看全部评分

 楼主| 发表于 2013-6-30 11:35:05 | 显示全部楼层
回复 4# xxpinqz

谢谢xxpinqz,今天没分加了...
这论坛的人真好,乐于助人,祝大家身体健康,开心快乐
 楼主| 发表于 2013-6-30 11:43:05 | 显示全部楼层
刚发现添加的文本是直接跟在原有文本的最后,结果类似于:
这是原有文本内容。然后直接就接上随机的内容了。

有没有办法换一行再接上呢?例如:
这是原有文本内容。
接上随机的内容,但是换一行再接。

麻烦各位再帮我改一下,谢谢!
发表于 2013-6-30 12:13:59 | 显示全部楼层
回复 4# xxpinqz
谢谢提醒 8行确实 应该  ))>>"%%i"
 楼主| 发表于 2013-7-2 18:01:01 | 显示全部楼层
在all.txt保存接近50000行的数据,结果用这个批处理跑不动了,老半天没反应
发表于 2013-7-2 22:56:23 | 显示全部楼层
回复 8# needhelp
纯P处理这么大文件可不行,换个思路试试:

  1. @echo off&setlocal enabledelayedexpansion
  2. findstr /n .* all.txt >tmp
  3. for /l %%a in (1,1,1020) do (
  4.      set/a r=!random!+!random!%%17233+1
  5.      set "var=!var!!r!: "
  6. )
  7. for /f "tokens=1* delims=:" %%a in ('findstr /b "!var!" tmp') do (
  8.     set /a n+=1
  9.     if !n! leq 1000 set "#!n!=%%b"
  10. )
  11. for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /ivx "all\.txt"') do (
  12.     (for /l %%a in (1 1 10) do (
  13.         set /a n=!random!%%1000+1
  14.         for %%b in (!n!) do echo !#%%b!
  15.     ))>>"%%i"
  16. )
  17. del tmp
复制代码
发表于 2013-7-2 23:06:09 | 显示全部楼层
本帖最后由 xxpinqz 于 2013-7-3 19:22 编辑

或者不考虑随机数的顺序,效率会高一点
17233=50000-32767

  1. @echo off&setlocal enabledelayedexpansion
  2. set "fn=all.txt"
  3. for /l %%a in (1,1,1020) do (
  4.      set/a r=!random!+!random!%%17233+1
  5.      set "var=!var!!r!: "
  6. )
  7. findstr /n .* "%fn%"|findstr /b "%var%" >tmp
  8. (for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  9.     if not "%%i"=="%fn%" (
  10.         (for /l %%a in (1 1 10) do (
  11.              set/p str=
  12.               echo,!str:*:=!
  13.          ))>>"%%i"
  14.     )
  15. ))<tmp
  16. del tmp
复制代码
发表于 2013-7-4 19:56:21 | 显示全部楼层
高深莫测,膜拜!
发表于 2016-8-13 19:48:26 | 显示全部楼层
本帖最后由 pcl_test 于 2016-9-6 23:42 编辑

第三方
  1. #*&cls&dir /a-d/b *.txt|find /i /v "all.txt"|gawk -f "%~f0"&pause&exit
  2. BEGIN{
  3.     srand();
  4.     file="all.txt";
  5.     n=10;
  6.     while(getline<file>0){
  7.         m++;a[m]=$0;
  8.     }
  9.     while(getline>0){
  10.         s="\n";
  11.         for(i=1;i<=n;i++){
  12.             r=int(rand()*m+1);
  13.             s=s""a[r]"\n"
  14.         }
  15.         printf s>>$0;  
  16.     }
  17. }
复制代码
发表于 2018-12-12 09:33:14 | 显示全部楼层
回复 2# terse

大侠你好,看了你的这个命令以,用了一下,好好玩呀,你真厉害!
如果这个批处理命令要是改成在头部添加,怎么写,我是菜鸟,什么也不懂,请指教,谢谢!
发表于 2018-12-21 18:18:19 | 显示全部楼层
回复 12# pcl_test


老大,这个代码运行后没有任何动作?

如果是取一个文件中随机的几个行加到其它文件中做内容,这个代码…………????
发表于 2018-12-21 18:33:36 | 显示全部楼层
回复 12# pcl_test


前面没看懂,原来是第三方,不知道要怎么运行,还请指教,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 23:01 , Processed in 0.023944 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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