标题: [文本处理] 批处理怎样查找显示字符串所在行和下面几行内容? [打印本页]
作者: 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会忽略小数点后的数据,因此只能输入整数,否则计算结果错误。- @echo off
- findstr “ROTORMASS (KG*M2) TOTAL”%~dp0\ljzs-in\abc.st
- set /p N=N: 必须整数
- set /p M=M: 必须整数
- set /p MT=MT: 必须整数
- set /a a=4*6350*%MT%/%N%
- set /a b=4*6350*%M%/%N%
- echo a= 4*6350*%MT%/%N%=%a%
- echo b= 4*6350*%M%/%N%=%b%
- pause
复制代码
网上找到一段使用findstr查找字符串所在行和下面一行内容的代码。此代码觉得可以借鉴,但不知道如何更改。- @Echo Off&Setlocal Enabledelayedexpansion
- For /f "tokens=1* delims=:" %%i in ('Type a.txt^|Findstr /n "问问"') do (
- Set n=&Set /a n=%%i+1
- Echo %%j>>b.txt
- For /f "tokens=1* delims=:" %%a in ('Type a.txt^|Findstr /n "."') do (If %%a==!n! Echo %%b>>b.txt)
- )
- Pause
复制代码
作者: SQYSQYSQY 时间: 2019-1-10 21:46
本帖最后由 SQYSQYSQY 于 2019-1-10 21:52 编辑
复制代码
抱歉,我思路很乱,所以可能有不必要命令。
数不能太长,否则会计算失败。
文本内不要有特殊字符。如(&><?|等等
作者: 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 行的数据吗?
简化版:列标固定,行标采用匹配- use File::Slurp;
- my @lines = read_file("abc.st");
- my %rows = map { s/^\s+//; (split /\s+/, $_)[0,2] } @lines;
- grep { printf "%s 4*6500*(%s)/1500 = %s\n", $_, $rows{$_}, 4*6500*$rows{$_}/1500 } qw(1 TOTAL);
复制代码
感觉会有一句话代码。
作者: yhcfsr 时间: 2019-1-11 00:03
- @set @n=0/*&echo off
- ::源文件路径
- set "SrcTxt=%~dp0test.txt"
- if not exist "%SrcTxt%" echo;file not found&pause&exit
-
- for /f "tokens=1,2" %%a in ('cscript -nologo -e:jscript "%~0" "%SrcTxt%"') do set "a=%%a"&set "b=%%b"
- echo;a=%a%
- echo;b=%b%
- pause&exit */
-
-
- //以下是JS代码
- var fso=new ActiveXObject('scripting.FileSystemObject');
- fo =fso.OpenTextFile(WScript.Arguments(0));
- var count=0;
- while(!fo.AtEndOfStream)
- {
- line=fo.ReadLine();
- if(line.match(/ROTOT|ROTORMASS/gim))
- while(!fo.AtEndOfStream)
- {
- line=fo.ReadLine();
- count+=1;
- switch(count)
- {
- case 1:
- num=line.replace(/.*\s+([0-9.]+)\s+[0-9.]+$/gim,'$1');
- a=(4*6500*num/1500).toFixed(4);
- break;
- case 4:
- num=line.replace(/.*\s+([0-9.]+)\s+[0-9.]+$/gim,'$1');
- b=(4*6500*num/1500).toFixed(4);
- break;
- }
- if(4==count) break;
- }
- if(4==count) break;
- }
- WSH.Echo(a,b);
- fo.close();
复制代码
作者: xczxczxcz 时间: 2019-1-11 08:01
- $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
就我这个最适合楼主需求了吧 :)- for /f "tokens=1,3" %%a in (abc.st) do (
- if %%a equ 1 set a=%%b
- if %%a equ TOTAL set b=%%b
- )
- set psCommand=powershell -command "('{0},{1}' -f ((4*6500*%a%/1500),(4*6500*%b%/1500)))"
- for /f "usebackq tokens=1,2 delims=," %%a in (`%psCommand%`) do (
- set a=%%a
- set b=%%b
- )
复制代码
作者: WHY 时间: 2019-1-11 12:59
本帖最后由 WHY 于 2019-1-12 19:46 编辑
- @echo off
- for /f "tokens=3" %%i in ('sed -n "/ROTOT.*ROTORMASS/{n;p;n;n;n;p}" a.txt') do (
- for /f %%j in ('mshta "javaScript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(4*65*%%i/15);close()"') do echo;%%j
- )
- pause
复制代码
- gawk "{if(a){++n; if(n==1||n==4)printf \"%%0.6f\n\",4*6500*$3/1500}}; /ROTOT.*ROTORMASS/{a=1}" a.txt
复制代码
- 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:- gc abc.st|%{if($_){$n+=,($_.trim() -split '\s+')}};(0..$n.count)|%{if($n[$_] -cmatch '^ROTO'){(($_+1),($_+4))|%{4*65*$n[$_][2]/15}}}
- cmd /c pause
复制代码
bat 混合ps 美化版- @echo off
- 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}}}"
- echo;&pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |