【问题标题】:Compare the absolute value of a number in a for loop to determine if it's to be used?在for循环中比较一个数字的绝对值以确定是否要使用它?
【发布时间】:2017-03-07 03:57:37
【问题描述】:

我现在正在处理我在这篇文章中提到的更大的问题...Searching a text file and sending only numbers greater than a certain absolute value to text file?

我想如果我 set num=!num:-=! 的原始值为 -17,那么 !errorlevel! 将评估为 true 或 0 对吗?不过这里有些东西不工作......

为了澄清,我只需要过滤掉第四个标记大于 3 或小于 -3 的行的第一个和第四个标记,以及任何没有第四个标记的行(这部分已解决)。我尝试使用 set 的 /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

lasd:S:dd 0 0

【问题讨论】:

    标签: batch-file cmd errorlevel


    【解决方案1】:
    @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
    

    【讨论】:

    • 我真的很喜欢这种方法。优雅的!谢谢@MC ND!
    【解决方案2】:
    @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!
            )
        )
    )
    

    【讨论】:

      【解决方案3】:
      set /A num=%%b
      set num=!num:-=!
      

      这将num 建立为%%b 的算术值。请注意,环境变量是 always 字符串。分配根据需要以各种方式进行转换。您的作业将分配一个值(例如)"-4"(包括引号)

      第二个命令使用num 中的字符串 并将所有- 更改为*nothing*,因此假设它具有适当的-number 结构来计算绝对值。

      除此之外,我不知道您创建输出的意图是什么,因为您没有说明输出应该是什么。无论哪种方式,errorlevel 都不会受到set AFAIAA 的影响。

      请注意,%%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 过滤器的每一行,如果缺少第4 列,则生成星号,否则将num 设置为%%b 中的值,并从中删除任何-。如果结果数字大于 3,则回显原始的 %%b,否则 - 好吧,为了完整起见,我制作了一个报告行。显然,那可以是remmed out。

      【讨论】:

      • 作为一个学术练习,也可以用bitwise operations得到一个数字的绝对值。 set /a "x = %%~b, mask = x >> 31, x = (x ^ mask) - mask"
      • @Magoo Ive 更新了我的帖子以阐明我的目标。本质上,我只想从第 4 个令牌中值小于 -3 或大于 3 的所有行中获取令牌 1 和 4 并发送到文件。 /a 选项似乎没有这样做。
      猜你喜欢
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多