需要代币和熟食专家的帮助

tokens and delims expert help needed

我最近一直在大量使用批处理,在我的工作中取得了很好的效果,并且也在一些地方使用了一些功能 shell,效果很好。

总是让我感到困惑的一件事是通过循环等工作时的令牌和 delims 概念。我看过你的管视频并阅读了经典的 rob van 页面。我有点明白,但是当我需要使用它时,它并不基本。

我举了一个例子,如果有人足够友好地解释你如何选择令牌和 delims 的数量,那将非常有帮助。我需要从网页的各个列中推断出 PC 主机名。我可以将文本复制到文本板中,并希望 "echo out" 到另一个文件中,只是计算机名称。

24 Nov 2016 09:45 GMT   194.176.105.132 United Kingdom  ID006962.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:44 GMT   194.176.105.154 United Kingdom  ID006976.CENTRAL    3.10.5.0    Remove
24 Nov 2016 09:43 GMT   194.176.105.146 United Kingdom  ID007634.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:41 GMT   194.176.105.138 United Kingdom  ID006961.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:28 GMT   194.176.105.132 United Kingdom  ID007643.CENTRAL    3.10.5.0    Remove

计算机名称是 ID0006962 数字,但我不需要尾随 .CENTRAL。从这个文本我只需要另一个带有主机名的文本文件。我可以做所有那部分,它只是外推数据元素。有时列表很大,最好将它保存到一个文本文件中 运行 一个针对它的 for 循环,然后吐出另一个只有主机名的文本文件。我想如果我能更深入地思考这个问题,我也可以将这些知识应用到我需要做的其他事情上。非常感谢任何提示!

另一个文本文件中的示例输出(我喜欢):-

ID006967                                                             
ID007566                                                               
ID007567                                                              
ID006976    
ID007643     

编辑我怎样才能同时获得主机名旁边的 3.10.6.0 等

ID006967     3.10.6.0                                                         
ID007566     3.10.6.0                                                          
ID007567     3.10.6.0                                                         
ID006976     3.10.6.0
ID007643     3.10.6.0

我尝试过但迷路了这就是我的想法...

@echo off

> "%~dp0test.txt" (
    for /F "usebackq tokens=4,5 delims= " %%J in ("%~dp0rob.txt") do @(
        for /F "tokens=1,3,4,5,6 delims=." %%I in ("%%J") do @echo(%%I
    )
)

所以我的想法(大声笑)...我希望将 4,5 个标记(第 4 列和第 5 列)提取到 %%J 我希望下一个循环回显附加标记以及主机名,所以仍然使用 '。'作为此测试中第 4 行和第 5 行的分隔符,我相信现在有 6 个标记可供选择....但输出仍然只显示主机名...我没有得到什么

ID006962(t1).CENTRAL(t2) 3(t3).10(t4).6(t5).0(t6)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q40784266.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO CALL :process %%a
)>"%outfile%"

GOTO :EOF

:process
FOR /f "tokens=1,2delims=." %%q IN ("%1") DO IF "%%r" equ "CENTRAL" (
 echo %%q
 GOTO :eof
) ELSE (
 SHIFT
 GOTO process
)

GOTO :eof

您需要更改 sourcedir 的设置以适合您的情况。 您需要更改 sourcedirdestdir 的设置以适合您的情况。

我使用了一个名为 q40784266.txt 的文件,其中包含您的数据用于我的测试。

生成定义为 %outfile%

的文件

将输入文件的每一行读取到 %%a 并调用 :process 将整行作为参数传递。

:process 采用提供的第一个参数 (24) 并尝试使用 . 作为分隔符解析为标记。如果第二个标记(在 %%r 中)不是 "CENTRAL" 则 shift 参数并重试。

"Nov","2016","09:45","GMT"每个都没有第二个token,所以shift
“194.176.105.132”的第二个标记“176”不匹配,所以 shift
"United","Kingdom" 没有第二个标记,所以 shift
"ID006962.CENTRAL" 有第二个标记,它匹配 "CENTRAL",所以打印第一个,"ID006962" 并走到最后,放弃其余参数“3.10.6.0”和 "Remove"

请注意,Central African Republic 之类的字符串不会通过测试,因为 CENTRAL 的匹配区分大小写,而 "Central" 没有第二个标记。

请注意,某些语法元素对布局敏感。建议使用文本编辑器进行剪切和粘贴,而不是文字处理器,后者可能会默默 "format" 代码。请注意 NOTEPAD 也倾向于格式化代码。我使用 EDITPLUS.

您的数据似乎是 TAB 分隔的 table,由六列组成。您要提取的部分字符串位于第四列。因此,让我们使用 for /F 循环来获取第四个标记(请注意,在 delims= 之后有一个 TAB 字符):

for /F "usebackq tokens=4 delims=   " %%J in ("inputfile.txt") do echo(%%J

这会提取像 ID0006962.CENTRAL 这样的字符串。现在让我们用另一个 for /F 循环拆分这个字符串:

for /F "tokens=1 delims=." %%I in ("ID0006962.CENTRAL") do echo(%%I

然后让我们使用重定向将数据输出到文本文件:

> "outputfile.txt" echo(ID0006962

最后让我们把所有这些东西放在一起得到一个工作脚本:

> "outputfile.txt" (
    for /F "usebackq tokens=4 delims=   " %%J in ("inputfile.txt") do @(
        for /F "tokens=1 delims=." %%I in ("%%J") do @echo(%%I
    )
)

两种可能的解决方案。

第一个使用与aschipfl的答案相同的想法只是稍微更精致,记住delims=TAB:

@(For /f "UseBackQTokens=4Delims=   " %%A In ("pagedata.txt"
) Do @Echo=%%~nA)>another.txt

第二个使用句点作为分隔符:

@(For /f "UseBackQTokens=4Delims=." %%A In ("pagedata.txt"
) Do @For %%B In (%%A.x) Do @If Not "%%~xB"=="" Echo=%%~nB)>another.txt

只需更改 pagedata.txt 的输入文件名和 another.txt 的输出文件名以适合您的目的。