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

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

本帖最后由 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行数据可以有重复的行)

麻烦大神们帮帮忙,先谢谢各位了,祝大家开心快乐

本帖最后由 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

评分人数

TOP

回复 2# terse


    谢谢 terse的帮助,我试了一下你给的代码,但是跟我想要的效果有点差别,应该是我之前的提问没说清楚,
我想要的结果是,把随机取得的10行添加到其它文本文件的最末,而不是把这些文本文件里的内容给替换成这10行随机的内容。
terse你给的代码是把原有的文本文件里的内容给替换成这10行随机的内容了,你能再帮忙改改吗? 谢谢了

TOP

纯p这样的效率应该很高了吧。
可惜findstr的结果会自动排序,要不效率应该会快点。
m取值为n不是更合理,第8行应该追加吧 ))>>"%%i"
1

评分人数

初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 4# xxpinqz

谢谢xxpinqz,今天没分加了...
这论坛的人真好,乐于助人,祝大家身体健康,开心快乐

TOP

刚发现添加的文本是直接跟在原有文本的最后,结果类似于:
这是原有文本内容。然后直接就接上随机的内容了。

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

麻烦各位再帮我改一下,谢谢!

TOP

回复 4# xxpinqz
谢谢提醒 8行确实 应该  ))>>"%%i"

TOP

在all.txt保存接近50000行的数据,结果用这个批处理跑不动了,老半天没反应

TOP

回复 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
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 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
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

高深莫测,膜拜!

TOP

本帖最后由 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. }
复制代码

TOP

回复 2# terse

大侠你好,看了你的这个命令以,用了一下,好好玩呀,你真厉害!
如果这个批处理命令要是改成在头部添加,怎么写,我是菜鸟,什么也不懂,请指教,谢谢!

TOP

回复 12# pcl_test


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

如果是取一个文件中随机的几个行加到其它文件中做内容,这个代码…………????

TOP

回复 12# pcl_test


前面没看懂,原来是第三方,不知道要怎么运行,还请指教,谢谢

TOP

返回列表