windows 批处理脚本中的 AWK 等价物

AWK equivalent in windows batch script

我有一个文件test.txt作为

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

我需要根据第一个和第二个词得到最后一个词。我使用 AWK 在 Unix 中创建了它:

cat get_room_rent.ksh
#!/bin/ksh
FILE_NAME=test.ksh
awk -F: '{ if ( == room_name &&  == type) {print } }' room_name= type= $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
@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 中的定界符处理丢弃了行首的起始定界符,从这里开始编号差异。开头的:被丢弃,房间名称成为记录中的第一个字段。

好吧,我认为您误解了 for /f 循环中 tokens 参数的语法。该值应该是数字,并确定在填充 %%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。如果您希望搜索区分大小写,请从 findstr 命令中删除 /i 开关。

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]
  }
}