Windows批处理脚本中的AWK等效项

时间:2015-03-16 12:21:16

标签: batch-file batch-processing

我有一个文件test.txt为

:ROOM1: :CITY: :2000:
:ROOM2: :RURAL: :1500:
:ROOM3: :CITY: :3000:

我需要根据第一个和第二个单词得到最后一个单词。我是在Unix上使用AWK制作的:

cat get_room_rent.ksh
#!/bin/ksh
FILE_NAME=test.ksh
awk -F: '{ if ($2 == room_name && $4 == type) {print $6} }' room_name=$1 type=$2 $ROOM_RENT
echo ${ROOM_RENT}

在脚本上方运行

RM_RNT=`./get_room_rent.ksh ROOM2 RURAL`

输出

1500

我需要在Windows批处理文件中做同样的事情......我不会安装AWK Windows版本。

我尝试了类似下面的内容,但我没有运气......

FOR /F "tokens=%ROOM2% delims=:" %%G IN (C:test.txt) DO echo Chosen word is: %%G&goto nextline
:nextline

set showme=Y
FOR /F "tokens=%ROOM2% delims=:" %%G IN (c:test.txt) DO if defined showme set showme=&echo Chosen word is: %%G

3 个答案:

答案 0 :(得分:3)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "ROOM_RENT=data.txt"

    rem Option 1 - First filter the contents
    for /f "tokens=5 delims=:" %%a in ('
        findstr /r /c:"^:%~1:[^:]*:%~2:" "%ROOM_RENT%"
    ') do echo %%a

    rem Option 2 - Iterate the file checking the fields
    for /f "usebackq tokens=1,3,5 delims=:" %%a in ("%ROOM_RENT%") do (
        if "%%~a"=="%~1" if "%%~b"=="%~2" echo %%~c
    )

使用get_room_rent.cmd ROOM2 RURAL调用批处理文件,您将检索所需的信息。

for /f命令使用指定的字符作为分隔符拆分记录。分割记录后,tokens子句指示要检索的标记列表(每个标记的索引)。

在第一个选项中,检索到的唯一标记是第五个标记,因为过滤行仅检索匹配的标记。在第二种情况下,检索三个涉及的令牌以处理测试。

为什么令牌的数量与AWK代码中的不匹配? for /f中的分隔符处理会丢弃行开头的起始分隔符,从这里开始编号差异。最初的:被丢弃,房间名称成为记录中的第一个字段。

答案 1 :(得分:0)

好吧,我认为你错误地认为tokens循环中for /f参数的语法。该值应该是数字,并在填充%%G之前确定要跳过的列数。

虽然这不会像awk那样有效,但最简单的解决方案是将findfindstr导入findstr - 每个参数一次。

for /f "tokens=3" %%I in (
    'findstr /i "%~1" "test.txt" ^| findstr /i "%~2"'
) do set "showme=%%I"

if defined showme echo Chosen word is %showme::=%

我认为无论如何都会有用。我没有测试过。将其称为batfile.bat room2 rural。如果您希望搜索区分大小写,请从/i命令中删除findstr个开关。

答案 2 :(得分:0)

IMO PowerShell是一个更好的解决方案。这是一种方式:

param($s1, $s2)
get-content "test.txt" | foreach-object {
  $row = ($_ -split ' ') -replace ':',''
  if ( ($s1 -eq $row[0]) -and ($s2 -eq $row[1]) ) {
    $row[2]
  }
}