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 那样有效,但最简单的解决方案是将 find
或 findstr
通过管道传输到 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]
}
}
我有一个文件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 那样有效,但最简单的解决方案是将 find
或 findstr
通过管道传输到 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]
}
}