标题: [文本处理] [已解决]批处理如何按指定行数进行合并行! [打印本页]
作者: xudaweb 时间: 2014-3-5 19:26 标题: [已解决]批处理如何按指定行数进行合并行!
本帖最后由 xudaweb 于 2014-3-7 15:55 编辑
如:一文本里有数据100行,每行只有1个数据- 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
复制代码
如何按照每10行合并成一行,每个数据之间用空格隔开,生成10行,每行10个。
或者每5行合并成一行,最后生成20行,顺序不允许改变,请各位指导一下。
作者: 522235677 时间: 2014-3-5 20:16
本帖最后由 522235677 于 2014-3-6 13:53 编辑
- @echo off & setlocal ENABLEDELAYEDEXPANSION
- for /f %%i in (1.txt) do (
- set /a n+=1
- set /a a=!n!%%10
- set /p=%%i <nul
- if "!a!"=="0" echo.
- )
- 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
- @echo off
- for /f "delims=" %%a in (1.txt) do (
- set /p=%%a <nul
- set /a "n+=1, 1/(n%%10)" 2>nul || echo,
- )
- 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楼的这样改:- @echo off & setlocal ENABLEDELAYEDEXPANSION
- (for /f %%i in (1.txt) do (
- set /a n+=1
- set /a a=!n!%%10
- if "!a!"=="0" (echo.) else (set /p=%%i <nul)
- ))>2.txt
- pause
复制代码
3楼的这样改:- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- set /p=%%a <nul
- set /a "n+=1, 1/(n%%10)" 2>nul || echo,
- ))>2.txt
- pause
复制代码
作者: DAIC 时间: 2014-3-6 11:04
- @echo off
- 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 - @echo off & setlocal ENABLEDELAYEDEXPANSION
- set h=6
- (for /f %%i in (java学习笔记.txt) do (
- set /a n+=1
- set /a a=!n!%%!h!
- if "!a!"=="0" (
- if "!h!"=="6" (set h=11) else (set h=6)
- set "n="
- echo.
- ) else (
- set /p=%%i <nul
- )
- ))>nuw.txt
- 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 - @echo off
- 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 - @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
复制代码
失误……
作者: 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 |