Board logo

标题: [文本处理] 批处理怎样查找显示字符串所在行和下面几行内容? [打印本页]

作者: meiszp    时间: 2019-1-10 20:29     标题: 批处理怎样查找显示字符串所在行和下面几行内容?

有一个文本文件abc.st,文件内容很长,需要进行以下操作:
1.查找并显示出同时包含“ROTOT”和 "ROTORMASS"字符串所在行和下面4行内容,即:

ROTOT  ROTORLAENGE   ROTORMASS    WELLENMASSE  
   1          .4220       71.5872       55.3404
   2        3.8710   5913.1533    4718.9148
   3          .5050     162.4036         79.9331
TOTAL  4.7980     6174.1442   4854.1884


2. 提取红色数字进行下面计算,数据是变化的,但位置不变。
   
a=4*6500*71.5872/1500

b=4*6500*6174.1422/1500

求大神帮助,希望是bat代码。因为自己写了一些处理此文件的bat代码,想把他们组合。


问题补充:
由于数据无法拷出,只能敲出部分内容,其他内容以图片形式提供。见网盘

https://pan.baidu.com/s/1QRgF6FOWl9yaIyge_jmqFg

最终想把提取的数据和计算显示在窗口。自己写了一个简单的代码,但有2个问题:
1.只能找出含有独一无二字符的行,即含有字符串的第1、2行和最后一行,数字行无法通过findstr寻找。
2.计算所需的71.5872和6174.1442不能自动获取,需要手动输入,bat会忽略小数点后的数据,因此只能输入整数,否则计算结果错误。
  1. @echo off
  2. findstr “ROTORMASS  (KG*M2) TOTAL”%~dp0\ljzs-in\abc.st
  3. set /p N=N: 必须整数
  4. set /p M=M: 必须整数
  5. set /p MT=MT: 必须整数
  6. set /a a=4*6350*%MT%/%N%
  7. set /a b=4*6350*%M%/%N%
  8. echo a= 4*6350*%MT%/%N%=%a%
  9. echo b= 4*6350*%M%/%N%=%b%
  10. pause
复制代码
网上找到一段使用findstr查找字符串所在行和下面一行内容的代码。此代码觉得可以借鉴,但不知道如何更改。
  1. @Echo Off&Setlocal Enabledelayedexpansion
  2. For /f "tokens=1* delims=:" %%i in ('Type a.txt^|Findstr /n "问问"') do (
  3. Set n=&Set /a n=%%i+1
  4. Echo %%j>>b.txt
  5. For /f "tokens=1* delims=:" %%a in ('Type a.txt^|Findstr /n "."') do (If %%a==!n! Echo %%b>>b.txt)
  6. )
  7. Pause
复制代码

作者: SQYSQYSQY    时间: 2019-1-10 21:46

本帖最后由 SQYSQYSQY 于 2019-1-10 21:52 编辑
  1. @echo off
  2. (
  3. rem 变量!z!是最终结果保留的小数位数(如果是无限的话)
  4. set "z=40"
  5. color f0
  6. SetLocal EnableDelayedExpansion
  7. set "c=0"
  8. for /f "tokens=*" %%a in (abc.st) do (
  9. set /a c+=1
  10. set "a=%%a"
  11. set "b=!a:ROTOT=!"
  12. if defined b (
  13. if not "!b!"=="%%a" (
  14. set "b=!b:ROTORMASS=!"
  15. if defined b (
  16. if not "!b!"=="!a!" goto a
  17. )
  18. )
  19. )
  20. )
  21. :a
  22. (
  23. set d=!c!
  24. set "b=0"
  25. for /f "tokens=*" %%a in (abc.st) do (
  26. if not "!b!"=="ture" (
  27. set /a b+=1
  28. if "!b!"=="!c!" (
  29. set "a=%%a"
  30. set "b=ture"
  31. echo !a!
  32. set "c=1"
  33. )
  34. ) else (
  35. set /a "c+=1"
  36. if !c! gtr 5 goto b
  37. set "a=%%a"
  38. echo !a!
  39. )
  40. )
  41. )
  42. :b
  43. (
  44. echo.
  45. set "a=0"
  46. set /a d+=1
  47. set b=
  48. for /f "tokens=1-3" %%a in (abc.st) do (
  49. if not "!b!"=="ture" (
  50. set /a "a+=1"
  51. if "!a!"=="!d!" (
  52. set "b=ture"
  53. set "e=%%c"
  54. set "c=1"
  55. )
  56. ) else (
  57. set /a c+=1
  58. if "!c!"=="4" (
  59. set "f=%%c"
  60. goto c
  61. )
  62. )
  63. )
  64. )
  65. :c
  66. (
  67. set /a "a=13"
  68. set /a "b=3"
  69. set "c=!a!"
  70. set "d=!b!"
  71. for /f "delims=. tokens=1-2" %%a in ("!e!") do (
  72. set s=%%a%%b
  73. set /a "a*=!s!"
  74. set "q=%%b"
  75. call :d q v
  76. for /l %%c in (1 1 !v!) do set "b=!b!0"
  77. )
  78. for /f "delims=. tokens=1-2" %%a in ("!f!") do (
  79. set s=%%a%%b
  80. set /a "c*=!s!"
  81. set "q=%%b"
  82. call :d q v
  83. for /l %%c in (1 1 !v!) do set "d=!d!0"
  84. )
  85. set /a b/=4
  86. set /a d/=4
  87. call :e !a! !b! x
  88. call :e !c! !d! y
  89. echo b=4*6500*!e!/1500=!x!
  90. echo.
  91. echo b=4*6500*!f!/1500=!y!
  92. echo.
  93. echo 计算完毕!
  94. pause
  95. exit /b
  96. )
  97. :d
  98. set i=!%~1!!%~1!!%~1!^
  99. 3FF3FE3FD3FC3FB3FA3F93F83F73F63F53F43F33F23F13F03EF3EE3ED3EC3EB3EA3E93E83E73E63E53E43E33E23E13E03DF3DE3DD3DC3DB3DA3D93D83D73D63D53D43D33D23D13D03CF3CE3CD3CC3CB3CA3C93C83C73C63C53C43C33C23C13C03BF3BE3BD3BC3BB3BA3B93B83B73B63B53B43B33B23B13B03AF3AE3AD3AC3AB3AA3A93A83A73A63A53A43A33A23A13A039F39E39D39C39B39A39939839739639539439339239139038F38E38D38C38B38A38938838738638538438338238138037F37E37D37C37B37A37937837737637537437337237137036F36E36D36C36B36A36936836736636536436336236136035F35E35D35C35B35A35935835735635535435335235135034F34E34D34C34B34A34934834734634534434334234134033F33E33D33C33B33A33933833733633533433333233133032F32E32D32C32B32A32932832732632532432332232132031F31E31D31C31B31A31931831731631531431331231131030F30E30D30C30B30A3093083073063053043033023013002FF2FE2FD2FC2FB2FA2F92F82F72F62F52F42F32F22F12F02EF2EE2ED2EC2EB2EA2E92E82E72E62E52E42E32E22E12E02DF2DE2DD2DC2DB2DA2D92D82D72D62D52D42D32D22D12D02CF2CE2CD2CC2CB2CA2C92C82C72C62C52C42C32C22C12C02BF2BE2BD2BC2BB2BA2B92B82B72B62B52B42B32B22B12B02AF2AE2AD2AC^
  100. 2AB2AA2A92A82A72A62A52A42A32A22A12A029F29E29D29C29B29A29929829729629529429329229129028F28E28D28C28B28A28928828728628528428328228128027F27E27D27C27B27A27927827727627527427327227127026F26E26D26C26B26A26926826726626526426326226126025F25E25D25C25B25A25925825725625525425325225125024F24E24D24C24B24A24924824724624524424324224124023F23E23D23C23B23A23923823723623523423323223123022F22E22D22C22B22A22922822722622522422322222122021F21E21D21C21B21A21921821721621521421321221121020F20E20D20C20B20A2092082072062052042032022012001FF1FE1FD1FC1FB1FA1F91F81F71F61F51F41F31F21F11F01EF1EE1ED1EC1EB1EA1E91E81E71E61E51E41E31E21E11E01DF1DE1DD1DC1DB1DA1D91D81D71D61D51D41D31D21D11D01CF1CE1CD1CC1CB1CA1C91C81C71C61C51C41C31C21C11C01BF1BE1BD1BC1BB1BA1B91B81B71B61B51B41B31B21B11B01AF1AE1AD1AC1AB1AA1A91A81A71A61A51A41A31A21A11A019F19E19D19C19B19A19919819719619519419319219119018F18E18D18C18B18A18918818718618518418318218118017F17E17D17C17B17A17917817717617517417317217117016F16E16D16C16B16A16916816716616516416316216116015F15E15D15C15B15A159158^
  101. 15715615515415315215115014F14E14D14C14B14A14914814714614514414314214114013F13E13D13C13B13A13913813713613513413313213113012F12E12D12C12B12A12912812712612512412312212112011F11E11D11C11B11A11911811711611511411311211111010F10E10D10C10B10A1091081071061051041031021011000FF0FE0FD0FC0FB0FA0F90F80F70F60F50F40F30F20F10F00EF0EE0ED0EC0EB0EA0E90E80E70E60E50E40E30E20E10E00DF0DE0DD0DC0DB0DA0D90D80D70D60D50D40D30D20D10D00CF0CE0CD0CC0CB0CA0C90C80C70C60C50C40C30C20C10C00BF0BE0BD0BC0BB0BA0B90B80B70B60B50B40B30B20B10B00AF0AE0AD0AC0AB0AA0A90A80A70A60A50A40A30A20A10A009F09E09D09C09B09A09909809709609509409309209109008F08E08D08C08B08A08908808708608508408308208108007F07E07D07C07B07A07907807707607507407307207107006F06E06D06C06B06A06906806706606506406306206106005F05E05D05C05B05A05905805705605505405305205105004F04E04D04C04B04A04904804704604504404304204104003F03E03D03C03B03A03903803703603503403303203103002F02E02D02C02B02A02902802702602502402302202102001F01E01D01C01B01A01901801701601501401301201101000F00E00D00C00B00A009008007006005004^
  102. 003002001000&set /a "%2=0x!i:~3069,3!"&goto :eof
  103. :e
  104. set 被除数=%1
  105. set 除数=%2
  106. set g=%3
  107. set /a 余数=!被除数!%%!除数!
  108. set /a 结果=%被除数%/%除数%
  109. set "l="
  110. set l=!l!!结果!.
  111. for /l %%i in (1 1 !z!) do (
  112. set /a 余数后补零=!余数!*10
  113. set /a 结果=!余数后补零!/%除数%
  114. if "!结果:~0,1!"=="-" set 结果=!结果:~-1!
  115. set l=!l!!结果!
  116. set /a 余数=!余数后补零!%%!除数!
  117. if "!余数!"=="0" goto f
  118. )
  119. goto f
  120. :f
  121. set "!g!=!l!"
  122. goto :eof
复制代码
抱歉,我思路很乱,所以可能有不必要命令。
数不能太长,否则会计算失败。
文本内不要有特殊字符。如(&><?|等等
作者: xystudio    时间: 2019-1-10 21:53

回复 1# meiszp


    你最终想得到的结果是啥
作者: ivor    时间: 2019-1-10 22:25

采用混编更快、更健壮、更简单,cmd+vbs or cmd+powershell
作者: 523066680    时间: 2019-1-10 22:32

本帖最后由 523066680 于 2019-1-11 14:12 编辑

Perl 用户路过   

是只提取行标为1以及TOTAL 行的数据吗?
简化版:列标固定,行标采用匹配
  1. use File::Slurp;
  2. my @lines = read_file("abc.st");
  3. my %rows = map { s/^\s+//; (split /\s+/, $_)[0,2] } @lines;
  4. grep { printf "%s 4*6500*(%s)/1500 = %s\n", $_, $rows{$_}, 4*6500*$rows{$_}/1500 } qw(1 TOTAL);
复制代码
感觉会有一句话代码。
作者: yhcfsr    时间: 2019-1-11 00:03

  1. @set @n=0/*&echo off
  2. ::源文件路径
  3. set "SrcTxt=%~dp0test.txt"
  4. if not exist "%SrcTxt%" echo;file not found&pause&exit
  5. for /f "tokens=1,2" %%a in ('cscript -nologo -e:jscript "%~0" "%SrcTxt%"') do set "a=%%a"&set "b=%%b"
  6. echo;a=%a%
  7. echo;b=%b%
  8. pause&exit */
  9. //以下是JS代码
  10. var fso=new ActiveXObject('scripting.FileSystemObject');
  11. fo =fso.OpenTextFile(WScript.Arguments(0));
  12. var count=0;
  13. while(!fo.AtEndOfStream)
  14. {
  15. line=fo.ReadLine();
  16. if(line.match(/ROTOT|ROTORMASS/gim))
  17. while(!fo.AtEndOfStream)
  18. {
  19. line=fo.ReadLine();
  20. count+=1;
  21. switch(count)
  22. {
  23. case 1:
  24. num=line.replace(/.*\s+([0-9.]+)\s+[0-9.]+$/gim,'$1');
  25. a=(4*6500*num/1500).toFixed(4);
  26. break;
  27. case 4:
  28. num=line.replace(/.*\s+([0-9.]+)\s+[0-9.]+$/gim,'$1');
  29. b=(4*6500*num/1500).toFixed(4);
  30. break;
  31. }
  32. if(4==count) break;
  33. }
  34. if(4==count) break;
  35. }
  36. WSH.Echo(a,b);
  37. fo.close();
复制代码

作者: xczxczxcz    时间: 2019-1-11 08:01

  1. $R=4*65/15;(gc 0.txt)|%{$N+=,($_ -split '\s+')};(0..$N.count)|%{if($N[$_] -match '^ROTOT' -and $N[$_] -match 'ROTORMASS'){$a=$R*$N[$_+1][3];$b=$R*$N[$_+4][2];$a;$b}}
复制代码
第二个计算出来会差几个百分点?
作者: ivor    时间: 2019-1-11 09:13

本帖最后由 ivor 于 2019-1-11 09:15 编辑

bat脚本混编powershell
就我这个最适合楼主需求了吧  :)
  1. for /f "tokens=1,3" %%a in (abc.st) do (
  2. if %%a equ 1 set a=%%b
  3. if %%a equ TOTAL set b=%%b
  4. )
  5. set psCommand=powershell -command "('{0},{1}' -f ((4*6500*%a%/1500),(4*6500*%b%/1500)))"
  6. for /f "usebackq tokens=1,2 delims=," %%a in (`%psCommand%`) do (
  7. set a=%%a
  8. set b=%%b
  9. )
复制代码

作者: WHY    时间: 2019-1-11 12:59

本帖最后由 WHY 于 2019-1-12 19:46 编辑
  1. @echo off
  2. for /f "tokens=3" %%i in ('sed -n "/ROTOT.*ROTORMASS/{n;p;n;n;n;p}" a.txt') do (
  3.     for /f %%j in ('mshta "javaScript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(4*65*%%i/15);close()"') do echo;%%j
  4. )
  5. pause
复制代码
  1. gawk "{if(a){++n; if(n==1||n==4)printf \"%%0.6f\n\",4*6500*$3/1500}}; /ROTOT.*ROTORMASS/{a=1}" a.txt
复制代码
  1. PowerShell "type a.txt|select-String 'ROTOT.*ROTORMASS' -Context 4|%%{$_.Context.PostContext[0,3]|%%{4*6500*($_.trim() -split '\s+')[2]/1500}}"
复制代码

作者: meiszp    时间: 2019-1-12 23:13

回复 2# SQYSQYSQY
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:13

回复 3# xystudio
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:13

回复 5# 523066680
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:14

回复 6# yhcfsr
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:14

回复 7# xczxczxcz
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:16

回复 8# ivor
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: meiszp    时间: 2019-1-12 23:17

回复 9# WHY
谢谢回复,之前的问题描述可能不清楚,已补充。
作者: xczxczxcz    时间: 2019-1-13 08:00

楼顶文字与附件内容不一致。复制原文内容时不要修改内容、空格、空行。
按附件内容:win7以上。XP需安装PS2.0
Powershell:
  1. gc abc.st|%{if($_){$n+=,($_.trim() -split '\s+')}};(0..$n.count)|%{if($n[$_] -cmatch '^ROTO'){(($_+1),($_+4))|%{4*65*$n[$_][2]/15}}}
  2. cmd /c pause
复制代码
bat  混合ps 美化版
  1. @echo off
  2. PowerShell -ExecutionPolicy Bypass -c "gc abc.st|%%{if($_){$n+=,($_.trim() -split '\s+')}};(0..$n.count)|%%{if($n[$_] -cmatch '^ROTO'){(($_+1),($_+4))|%%{Write-Host $($n[$_][2])' ' -NoNewLine;Write-Host $(\"{0:n3}\" -f (4*65*$n[$_][2]/15)) -fore Red}}}"
  3. echo;&pause
复制代码





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