Board logo

标题: [文本处理] [已解决]批处理如何按指定行数进行合并行! [打印本页]

作者: xudaweb    时间: 2014-3-5 19:26     标题: [已解决]批处理如何按指定行数进行合并行!

本帖最后由 xudaweb 于 2014-3-7 15:55 编辑

如:一文本里有数据100行,每行只有1个数据
  1. 584
  2. H52
  3. G52
  4. 482
  5. 432
  6. F52
  7. E52
  8. 330
  9. 280
  10. D52
  11. C52
  12. 178
  13. 128
  14. B52
  15. A52
  16. 26
  17. 583
  18. 520
  19. H51
  20. G51
  21. 431
  22. 368
  23. F51
  24. E51
  25. 279
  26. 216
  27. D51
  28. C51
  29. 127
  30. 64
  31. B51
  32. A51
  33. 582
  34. H50
  35. G50
  36. 481
  37. 430
  38. F50
  39. E50
  40. 329
  41. 278
  42. D50
  43. C50
  44. 177
  45. 126
  46. B50
  47. A50
  48. 25
  49. 581
  50. 519
  51. H49
  52. G49
  53. 429
  54. 367
  55. F49
  56. E49
  57. 277
  58. 215
  59. D49
  60. C49
  61. 125
  62. 63
  63. B49
  64. A49
  65. 580
  66. H48
  67. G48
  68. 480
  69. 428
  70. F48
  71. E48
  72. 328
  73. 276
  74. D48
  75. C48
  76. 176
  77. 124
  78. B48
  79. A48
  80. 24
  81. 579
  82. 518
  83. H47
  84. G47
  85. 427
  86. 366
  87. F47
  88. E47
  89. 275
  90. 214
  91. D47
  92. C47
  93. 123
  94. 62
  95. B47
  96. A47
  97. 578
  98. H46
  99. G46
  100. 479
复制代码
如何按照每10行合并成一行,每个数据之间用空格隔开,生成10行,每行10个。
或者每5行合并成一行,最后生成20行,顺序不允许改变,请各位指导一下。
作者: 522235677    时间: 2014-3-5 20:16

本帖最后由 522235677 于 2014-3-6 13:53 编辑
  1. @echo off & setlocal ENABLEDELAYEDEXPANSION
  2. for /f %%i in (1.txt) do (
  3.         set /a n+=1
  4.         set /a a=!n!%%10
  5. set /p=%%i <nul
  6.         if "!a!"=="0" echo.
  7. )
  8. pause
复制代码
584 H52 G52 482 432 F52 E52 330 280 D52
C52 178 128 B52 A52 26 583 520 H51 G51
431 368 F51 E51 279 216 D51 C51 127 64
B51 A51 582 H50 G50 481 430 F50 E50 329
278 D50 C50 177 126 B50 A50 25 581 519
H49 G49 429 367 F49 E49 277 215 D49 C49
125 63 B49 A49 580 H48 G48 480 428 F48
E48 328 276 D48 C48 176 124 B48 A48 24
579 518 H47 G47 427 366 F47 E47 275 214
D47 C47 123 62 B47 A47 578 H46 G46 479
作者: apang    时间: 2014-3-6 09:29

  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do (
  3.     set /p=%%a <nul
  4.     set /a "n+=1, 1/(n%%10)" 2>nul || echo,
  5. )
  6. pause
复制代码

作者: xudaweb    时间: 2014-3-6 09:44

回复 2# 522235677


    可以把结果单独导成TXT文本么?
作者: xudaweb    时间: 2014-3-6 09:50

回复 3# apang

能把两行set的语法解释一下么?看不懂。。。

还有怎么样把处理的结果导到txt文本里?
作者: DAIC    时间: 2014-3-6 11:01

回复 5# xudaweb


2楼的这样改:
  1. @echo off & setlocal ENABLEDELAYEDEXPANSION
  2. (for /f %%i in (1.txt) do (
  3.         set /a n+=1
  4.         set /a a=!n!%%10
  5.         if "!a!"=="0" (echo.) else (set /p=%%i <nul)
  6. ))>2.txt
  7. pause
复制代码
3楼的这样改:
  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     set /p=%%a <nul
  4.     set /a "n+=1, 1/(n%%10)" 2>nul || echo,
  5. ))>2.txt
  6. pause
复制代码

作者: DAIC    时间: 2014-3-6 11:04

  1. @echo off
  2. gawk "{printf (NR%%10)?$0 FS:$0\"\n\"}" a.txt > b.txt
复制代码

作者: xudaweb    时间: 2014-3-6 11:21

回复 7# DAIC

感谢各位的帮忙。

请问能不能以5,10分别合并呢?第一行5个第二行10个这样交替进行合并?数据的顺序还是保持不变。
作者: 522235677    时间: 2014-3-6 11:48

回复 8# xudaweb
  1. @echo off & setlocal ENABLEDELAYEDEXPANSION
  2. set h=6
  3. (for /f %%i in (java学习笔记.txt) do (
  4. set /a n+=1
  5. set /a a=!n!%%!h!
  6. if "!a!"=="0" (
  7. if "!h!"=="6" (set h=11) else (set h=6)
  8. set "n="
  9. echo.
  10. ) else (
  11. set /p=%%i <nul
  12. )
  13. ))>nuw.txt
  14. pause
复制代码
584 H52 G52 482 432
E52 330 280 D52 C52 178 128 B52 A52 26
520 H51 G51 431 368
E51 279 216 D51 C51 127 64 B51 A51 582
G50 481 430 F50 E50
278 D50 C50 177 126 B50 A50 25 581 519
G49 429 367 F49 E49
215 D49 C49 125 63 B49 A49 580 H48 G48
428 F48 E48 328 276
C48 176 124 B48 A48 24 579 518 H47 G47
366 F47 E47 275 214
C47 123 62 B47 A47 578 H46 G46 479
作者: DAIC    时间: 2014-3-6 12:43

回复 9# 522235677


    丢掉了一些数字,不够100个啦。
作者: DAIC    时间: 2014-3-6 12:43

回复 8# xudaweb
  1. @echo off
  2. gawk "{printf (NR%%15)?$0 FS:$0\"\n\"}" a.txt | gawk "{for(i=1;i<5;i++)printf \"%%s \",$i;print $i;for(j=6;j<NF;j++)printf \"%%s \",$j;print $j}" > b.txt
复制代码

作者: 522235677    时间: 2014-3-6 13:46

回复 10# DAIC
  1. @echo off & setlocal ENABLEDELAYEDEXPANSION
  2. set h=5
  3. for /f %%i in (java学习笔记.txt) do (
  4.         set /a n+=1
  5.         set /a a=!n!%%!h!
  6. set /p=%%i <nul
  7.         if "!a!"=="0" (
  8.                 if "!h!"=="5" (set h=10) else (set h=5)
  9.                 set "n="
  10.                 echo.
  11.         )
  12. )
  13. pause
复制代码
失误……
作者: xudaweb    时间: 2014-3-6 16:11

本帖最后由 xudaweb 于 2014-3-6 16:13 编辑

回复 12# 522235677

能稍微解释一下中间判断的红色部分么?看不明白。。。

@echo off & setlocal ENABLEDELAYEDEXPANSION
set h=5
for /f %%i in (java学习笔记.txt) do (
        set /a n+=1
        set /a a=!n!%%!h!
        set /p=%%i <nul
        if "!a!"=="0" (
                if "!h!"=="5" (set h=10) else (set h=5)
                set "n="
                echo.

        )
)
pause
作者: 522235677    时间: 2014-3-6 19:52

set /a a=!n!%%!h!  这个就是算1除以5(10)得出的余数 (以便知道是否处理了十个或者五个数据)
set /p=%%i <nul     这个是将多行显示在一行
if "!a!"=="0" (  这个!a!就是上面那个计算出来的余数,如果余数为0的话,那说明已经处理到第十行或者第五行了
if "!h!"=="5" (set h=10) else (set h=5)     检测当然处理的行是多少个值,是5个的话,就换成10来出来,如果是10的话就换为5,这样就实现了交替输出
set "n="  这个就是重新计算行数
echo.  达到5或10行该换行处理了
作者: xudaweb    时间: 2014-3-6 20:49

回复 14# 522235677

太详细了,这下终于明白了!感谢~
作者: zhanglei1371    时间: 2014-3-7 21:21

回复 7# DAIC


    这段代码可否解释下,尤其中间FS:处,不太理解,学习下……
作者: DAIC    时间: 2014-3-7 21:26

回复 16# zhanglei1371


? : 是三元描述符
类似于 if () ... else ...
FS 是列分隔符
作者: sbjugt    时间: 2014-3-9 14:05

@echo off
for /f %%i in (a.txt) do (set a=%%i&&goto:a)
:a
echo %a%
set /a c=1
set /a d=10
:c
for /f "skip=%c% tokens=* delims=" %%i in (a.txt) do (set b=%%i&&goto :b)
:b
set /a e=%c%%%10
if %e%==0 (set a=%b%) else (set a=%a% %b%)
set /a c=c+1
if %c% lss %d% goto :c
echo %a%>>c.txt
set /a d=%d%+10
if %d% lss 110 goto :c
exit
作者: sbjugt    时间: 2014-3-9 14:34

回复 2# 522235677


    能不能解释下 set /p=%%i <nul
作者: 522235677    时间: 2014-3-9 20:35

回复 19# sbjugt


    批处理重定向




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