返回列表 发帖

[文本处理] 批处理如何从一个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行 >
休息
@echo off&setlocal enabledelayedexpansion
set m=1000
for /f "delims=" %%i in (all.txt) do set /an+=1&set #!n!=%%i
for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /ivx "all\.txt"') do (
    (for /l %%a in (1 1 10) do (
        set /a n=!random!%%m+1
        for %%b in (!n!) do echo !#%%b!
    ))>>"%%i"
)
pauseCOPY
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处理这么大文件可不行,换个思路试试:
@echo off&setlocal enabledelayedexpansion
findstr /n .* all.txt >tmp
for /l %%a in (1,1,1020) do (
     set/a r=!random!+!random!%%17233+1
     set "var=!var!!r!: "
)
for /f "tokens=1* delims=:" %%a in ('findstr /b "!var!" tmp') do (
    set /a n+=1
    if !n! leq 1000 set "#!n!=%%b"
)
for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /ivx "all\.txt"') do (
    (for /l %%a in (1 1 10) do (
        set /a n=!random!%%1000+1
        for %%b in (!n!) do echo !#%%b!
    ))>>"%%i"
)
del tmpCOPY
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 xxpinqz 于 2013-7-3 19:22 编辑

或者不考虑随机数的顺序,效率会高一点
17233=50000-32767
@echo off&setlocal enabledelayedexpansion
set "fn=all.txt"
for /l %%a in (1,1,1020) do (
     set/a r=!random!+!random!%%17233+1
     set "var=!var!!r!: "
)
findstr /n .* "%fn%"|findstr /b "%var%" >tmp
(for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
    if not "%%i"=="%fn%" (
        (for /l %%a in (1 1 10) do (
             set/p str=
              echo,!str:*:=!
         ))>>"%%i"
    )
))<tmp
del tmpCOPY
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

高深莫测,膜拜!

TOP

本帖最后由 pcl_test 于 2016-9-6 23:42 编辑

第三方
#*&cls&dir /a-d/b *.txt|find /i /v "all.txt"|gawk -f "%~f0"&pause&exit
BEGIN{
    srand();
    file="all.txt";
    n=10;
    while(getline<file>0){
        m++;a[m]=$0;
    }
    while(getline>0){
        s="\n";
        for(i=1;i<=n;i++){
            r=int(rand()*m+1);
            s=s""a[r]"\n"
        }
        printf s>>$0;  
    }
}COPY

TOP

回复 2# terse

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

TOP

回复 12# pcl_test


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

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

TOP

回复 12# pcl_test


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

TOP

返回列表