如何使用批处理文件随机重新排列文本文件中的行

时间:2013-10-16 00:01:33

标签: file batch-file text random

我正在创建一个随机删除不同MAC地址的代码,但无法弄清楚如何执行此操作。我对如何处理这个问题的想法是使用这个脚本随机化或重新排列文本文件中MAC地址的顺序,但我无法弄清楚如何使用批处理文件执行此操作。这将如何工作,它将读取“maclist.txt”,然后使用随机顺序“maclist_temp.txt”创建一个新的临时文件,该文件将是重新排列的文件。然后,它将按顺序提取此随机文件。

我曾尝试使用Google并在网上搜索,但我找不到任何有用的内容。我仍在积极寻找,但任何建议都非常有用。

像提取和删除随机行然后添加到底部这样简单的操作可能会有效。随机化会更好,但我想保留原始列表。类似的东西:

  1. 制作maclist.txt的临时副本,名为maclist_temp.txt
  2. 取一个随机MAC地址,将其从maclist_temp.txt
  3. 中删除
  4. 读到底部
  5. 这就是我想要的,但欢迎任何建议。

5 个答案:

答案 0 :(得分:6)

您可以尝试使用batch file来帮助您改变maclist.txt。批处理代码的用法是

C:\> type list.txt | shuffle.bat > maclist_temp.txt

发出此命令后,maclist_temp.txt将包含随机的MAC地址列表。

希望这有帮助。

答案 1 :(得分:4)

这是一个更简单的随机化/随机化文件的方法,不需要临时文件。您甚至可以重用相同的输入文件名。

限制为:空白行和以;开头的行将被跳过,以=开头的行将删除所有前导=个符号,并将^个字符加倍

@echo off
setlocal
for /f "delims=" %%a in (maclist.txt) do call set "$$%%random%%=%%a"
(for /f "tokens=1,* delims==" %%a in ('set $$') do echo(%%b)>newmaclist.txt
endlocal

答案 2 :(得分:1)

这似乎有效。为它提供一个命令行参数来随机化。

    @echo off
    setlocal EnableDelayedExpansion

    rem read the number of lines in the file
    rem the find prepends the line number so we catch blank lines
    for /f "delims=" %%n in ('find /c /v "" %1') do set "len=%%n"
    set len=!len:*: =!
    rem echo %1 has %len% lines

    rem Relocate as many lines as there are lines in the file
    for /l %%j in (1 1 !len!) do (
      rem echo starting round %%j

      rem geta random number between 1 and the number of lines in the file
      set /a var=!random! %% !len! + 1
      rem echo relocating line !var!

      rem make sure there is no temp file
      if exist %1.temp del %1.temp

      rem read each line of the file, write any that don't match and then write the one that does
      <%1 (
        for /l %%i in (1 1 !len!) do (

          rem if it is the target line then save it
          if %%i == !var! (
            set /p found=
            rem echo saving !found!
          )

          rem if it is the target line then write it
          if not %%i == !var! (
            set /p other=
            rem echo writing !other!
            echo !other!>> %1.temp
          )
        )
        rem now write the target line at the end
        rem echo appending !found!
        echo !found!>> %1.temp
      )

      rem replace the original with the temp version
      move %1.temp %1>nul
    )

    rem print the result
    type %1

答案 3 :(得分:1)

放入cmd文件

for /f "tokens=2 delims=/" %%m in ('cmd /e:on /v:on /c "for /f %%f in (maclist.txt) do @echo !random!/%%f" ^| sort') do echo %%m

它生成一个cmd,它读取内部的mac列表,为mac添加一个随机值和一个斜杠,并对列表进行排序。然后在outter中将此列表拆分为使用斜杠作为分隔符并打印mac地址。

答案 4 :(得分:0)

我非常喜欢foxidriveapproach。尽管如此,我想提供一个解决方案,其中列出了所有列出的限制(尽管cmd - 相关的限制,例如文件大小&lt; 2 GiB和行长度&lt; ~8 KiB仍然存在)。

密钥是delayed expansion,需要切换到不丢失解释标记。这解决了^&%!(),{{1}等特殊字符的所有潜在问题},<>|

计数器"已经实施,以免丢失原始文本文件的单行,这可能会发生,因为index可能会返回重复值;附加random后,生成的变量名称index是唯一的。

$$!random!.!index!命令在原始文件的每一行之前,行号后跟冒号。因此,findstr /N /R "^"循环中没有任何行显示为空,这将忽略此类。行号也隐含地解决了前导分号的问题,即for /F的默认eol字符。

最后,在输出之前,包括第一个冒号(记住由for /F添加的所述前缀)的所有内容都会从每一行中删除,因此不会再解除相等的前导符号。

所以这是代码:

findstr