【问题标题】:AWK equivalent in batch scripting批处理脚本中的 AWK 等效项
【发布时间】:2012-09-28 09:10:51
【问题描述】:

我想要一个与此 AWK 脚本等效的批处理脚本:

awk '{print $3}'

一个文件有这样的内容:

XXX YYY : 8
Rrr rrr : 7
ddd rrr : 9

我想打印一个批处理脚本

8, 7, 9

有什么方法可以将每个值分配给循环并重定向到 if 条件?

【问题讨论】:

标签: awk find batch-file


【解决方案1】:
awk -F: '{x=x","$2;}END{print substr(x,2,length(x)-1)}' your_file

测试如下:

> cat temp
XXX YYY : 8
Rrr rrr : 7
ddd rrr : 9
> awk -F: '{x=x","$2;}END{print substr(x,2,length(x)-1)}' temp
 8, 7, 9

【讨论】:

    【解决方案2】:

    另一种解决方案:

     awk '{ if(NR<3) printf "%s, ", $4 }END{ print $4 }' file
    

    结果:

    echo -e "XXX YYY : 8\nRrr rrr : 7\nddd rrr : 9" | awk '{ if(NR<3) printf "%s, ", $4 }END{ print $4 }'
    8, 7, 9
    

    【讨论】:

    • 为什么是 if 条件?您可以只在 END 中使用 print "" 作为空行。它也会更通用。
    【解决方案3】:

    我不知道您要求的是 Windows Batch 脚本还是 awk 脚本,所以两者都有:

    test.txt:

    XXX YYY : 8
    Rrr rrr : 7
    ddd rrr : 9
    

    AWK

    awk 'NR > 1 {printf ", "}{printf $4}END{printf "\n"}' test.txt
    

    输出:

    8, 7, 9
    

    Windows 批处理脚本

    @echo off
    SET _c=
    FOR /F "tokens=4 delims= " %%G IN (test.txt) DO (
        IF DEFINED _c <nul set /p z=", "
        <nul set /p z=%%G
        SET _c=1
    )
    

    输出:

    8, 7, 9
    

    【讨论】:

    • 感谢您的回答,但我不明白您为什么使用&lt;nul set /p 而不是单独使用set?你能详细说明一下吗?
    • &lt;nul set /p var="text" 只是将“文本”打印到屏幕上而无需回车和换行字符的 hack。
    • 谢谢,我学到了一些东西(虽然我明天会忘记它:)。供将来参考和想知道的人:stackoverflow.com/questions/5623599/…
    【解决方案4】:

    这个awk '{print $3}' 将从您的示例文件中打印出: 的列表,而不是数字。你应该使用$4。或者,您在这里向我们展示了错误的文件格式。

    该 Awk 脚本的确切 Windows 等效项是:

    FOR /F "tokens=4" %%a IN (file.txt) DO ECHO %%a
    

    但是您显示的所需输出 8, 7, 9 也不是您的 Awk 脚本打印的内容。 产生输出的最简单的批处理命令是:

    FOR /F "tokens=4" %%a IN (file.txt) DO <nul SET /p="%%a, "
    

    如果你实在受不了最后多余的逗号,那就更复杂了:

    SETLOCAL
    FOR /F "tokens=4" %%a IN (file.txt) DO <nul CALL SET /p=%%,%% %%a& SET ,=,
    

    Windows 上的 AWK

    顺便说一下,Awk 可用于 Windows。引用不同,因此您的脚本将是:

    awk "{printf $4 \", \"}" file.txt
    

    或者为了去掉那个多余的逗号,它会变得稍微凌乱一些:

    awk "{printf (NR>1?\", \":\"\") $4}" file.txt
    

    【讨论】:

      【解决方案5】:

      直接输出到终端

      如果您已经有 awk.exe,请先尝试步骤 (3),然后再尝试 (1:3)

      AWK 已被同样向后兼容的 GAWK 取代(检查 (3) )。

      1. 获得正确的 GAWK

        所以我使用 Gawk v3.6.1 运行设置 link。运行 gawk-3.1.6-1-setup.exe

        在安装过程中记下您解压/安装到的目录的路径,选中二进制文件和文档,其余的是您的偏好。

      2. 提取 GAWK

        安装后,通过导航到您在安装中记下的路径并转到 bin 目录,从安装目录中提取 gawk.exe . 复制 gawk.exe 然后导航到您希望赋予 gawk 功能的批处理文件 (*.bat) 的目录并粘贴它(因为它是可移植的 *.exe 并且我的批处理的目的需要自给自足)。

      3. 使用正确的命令

        这些命令直接打印到终端,很好地格式化了我缺少的关键字,我花了一整天的时间在互联网上搜索,然后阅读一个将近 2000 行长的文本文件并在大括号前找到 BEGIN。 在阅读 *\man\cat1

        中的 gawk.1.txt 之前我没有想到
        gawk "BEGIN { print \"Hello world\"}"
        
        REM If you have printf from GNUwin32
        gawk "BEGIN { printf \"Hello world\"}"
        

      【讨论】:

      • 更正:'printf' 我从 CoreUtils for Windows 获得
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2016-05-22
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2013-09-12
      相关资源
      最近更新 更多