Board logo

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

作者: needhelp    时间: 2013-6-30 00:35     标题: 批处理如何从一个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 02:59

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

作者: needhelp    时间: 2013-6-30 10:26

回复 2# terse


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

纯p这样的效率应该很高了吧。
可惜findstr的结果会自动排序,要不效率应该会快点。
m取值为n不是更合理,第8行应该追加吧 ))>>"%%i"
作者: needhelp    时间: 2013-6-30 11:35

回复 4# xxpinqz

谢谢xxpinqz,今天没分加了...
这论坛的人真好,乐于助人,祝大家身体健康,开心快乐
作者: needhelp    时间: 2013-6-30 11:43

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

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

麻烦各位再帮我改一下,谢谢!
作者: terse    时间: 2013-6-30 12:13

回复 4# xxpinqz
谢谢提醒 8行确实 应该  ))>>"%%i"
作者: needhelp    时间: 2013-7-2 18:01

在all.txt保存接近50000行的数据,结果用这个批处理跑不动了,老半天没反应
作者: xxpinqz    时间: 2013-7-2 22:56

回复 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
复制代码

作者: xxpinqz    时间: 2013-7-2 23:06

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

作者: PCL2012    时间: 2013-7-4 19:56

高深莫测,膜拜!
作者: pcl_test    时间: 2016-8-13 19:48

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

作者: yjqrsyg    时间: 2018-12-12 09:33

回复 2# terse

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

回复 12# pcl_test


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

如果是取一个文件中随机的几个行加到其它文件中做内容,这个代码…………????
作者: yjqrsyg    时间: 2018-12-21 18:33

回复 12# pcl_test


前面没看懂,原来是第三方,不知道要怎么运行,还请指教,谢谢
作者: Batcher    时间: 2018-12-22 12:59

回复 15# yjqrsyg


    需要下载 gawk.exe http://bcn.bathome.net/s/tool/index.html?key=gawk
作者: yjqrsyg    时间: 2018-12-22 20:24

回复 16# Batcher


谢谢




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2