3

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

awk '{print $3}'

文件具有以下内容:

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

我想打印一个批处理脚本

8, 7, 9

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

4

5 回答 5

7

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

测试.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
于 2012-10-08T07:26:22.080 回答
2
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
于 2012-10-08T06:30:26.113 回答
1

另一种解决方案:

 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
于 2012-10-08T07:00:01.730 回答
0

这将从您的示例文件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
于 2013-06-02T08:59:44.693 回答
0

直接输出到终端

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

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

  1. 获得正确的 GAWK

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

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

  2. 提取 GAWK

    安装后,通过导航到您在 install 中记下的路径并转到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\"}"
    
于 2015-08-21T16:16:38.830 回答