2017-03-07 58 views
0

,现在我明白我在这篇文章中提到的更大的问题... Searching a text file and sending only numbers greater than a certain absolute value to text file?比较for循环中数字的绝对值以确定它是否被使用?

我想如果我set num=!num:-=!用的,比方说,-17原始值,那么!errorlevel!将评估结果为true或0吧?有些东西在这里虽然不起作用,但...

为了澄清,我只需要筛选出第四个标记大于3或小于-3的第一个和第四个标记,以及任何行没有第四个标记(这部分已解决)。我已经尝试使用集合的/A选项,它似乎仍然工作。

setlocal enabledelayedexpansion 

set "min=-" 

for /f "tokens=1,4" %%a in ('findstr /b /r /c:"[^ ]*:S:" print.log') do (
    if %%b=="" (echo %%a ^*^*^* >>new.txt) else (
     set num="%%b" 
     set num=!num:-=! 
     if !errorlevel!==0 (
      if !num! GTR 3 echo %%a !min!!num! >> new.txt 
     ) else (
      if !num! GTR 3 echo %%a !num! >> new.txt 
     ) 
    ) 
) 

exit /b 

print.log的文字是这样的:

ksdf 0 0 -4

as7d:S:ASF 0 0 -4

KC:S:CD3 0 0 - 2

asdk:S:s 0 0 6

la SD:S:DD 0 0

回答

2
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    >"new.txt" (
     for /f "tokens=1,4" %%a in (' 
      findstr /b /r /c:"[^ ]*:S:" print.log 
     ') do if "%%~b"=="" (echo %%a ***) else (
      set "print=1" 
      if %%b lss 4 if %%b gtr -4 set "print=" 
      if defined print echo %%a %%b 
     ) 
    ) 

除了打印时的值小于-3或大于3时,当该值大于4小于-4

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
      ^.................^ 
       don't print 
+0

我真的很喜欢这种方法。优雅!谢谢@ MC ND! – Glycoversi

0
set /A num=%%b 
set num=!num:-=! 

这建立num作为%%b算术值。请注意,环境变量是总是字符串。分配按需要进行各种转换。你的任务会分配一个值(例如)"-4"(包括引号)

第二个命令使用num和更改所有-*nothing*因此计算absolte价值假设它是适当的-number结构。除此之外,我不知道你的意图是创建你的输出,因为你;没有指出输出应该是什么。无论如何,errorlevel将不会受到AFIIAA的set影响。

请注意,%%b仍将包含您使用echo处读取的原始数字。您可以在%%b!num!上执行if - 并根据需要在您的echo中使用%%b!num!

你不说什么你gtr 3企业是专门做...


@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q42639932.txt" 
FOR /f "tokens=1,4" %%a IN ('findstr /b /r /c:"[^ ]*:S:" "%filename1%"') DO (
if "%%b"=="" (echo %%a ^*^*^*) else (
    set num=%%b 
    set num=!num:-=! 
    if !num! GTR 3 (echo %%a %%b 
) else (
    ECHO just FOR demo %%a %%b 
) 
) 
) 

GOTO :EOF 

你需要改变的sourcedir设置,以满足您的具体情况。

我使用了一个名为q42639932.txt的文件,其中包含您的数据+额外资料用于我的测试。

对于每个通过findstr滤波器,如果column4缺少线,产生星号否则在%%b设置num到的值,并从它除去任何-。如果结果数字大于3,则另外回显原始%%b - 好吧,我已经完成了一条报告。显然,这可以是rem med out。

+0

正如较低和更大的未打印一个学术练习,也可以通过[按位操作]获取数字的绝对值(http://stackoverflow.com/a/12041874/1683264)。 'set/a“x = %%〜b,mask = x >> 31,x =(x^mask) - mask”' – rojo

+0

@Magoo Ive更新了我的帖子以阐明我的目标。基本上我想从第四个标记中的值小于-3或大于3的所有行中获取标记1和4并发送到文件。/a选项似乎不这样做。 – Glycoversi

0
@ECHO OFF 
SETLOCAL EnableExtensions EnableDelayedExpansion 
set "threshold=3" 
>new.txt (
    for /f "tokens=1,4" %%a in ('findstr /b /r /c:"[^ ]*:S:" print.log') do (
     if "%%b"=="" (
      echo %%a ^*^*^* 
     ) else (
      set /A num=%%b 
      if !num! GEQ 0 (
       set "min=" 
      ) else (
       set "num=!num:-=!" 
       set "min=-" 
      ) 
      if !num! GTR %threshold% echo %%a !min!!num! 
     ) 
    ) 
) 
相关问题