我有一个文件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
答案 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那样有效,但最简单的解决方案是将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
。如果您希望搜索区分大小写,请从/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]
}
}