Windows 如何获得非常非标准格式文本文件的必要值?
我有一个输出,它是这样的文本文件(Windows 如何获得非常非标准格式文本文件的必要值?,windows,batch-file,awk,cmd,Windows,Batch File,Awk,Cmd,我有一个输出,它是这样的文本文件(C:\test.txt) 不用说,这真是一团糟。 但是,我想得到“unused”列的值,即111640 我的机器是Windows,我尝试了以下代码,但没有提供任何信息: @echo off SET _c= FOR /F "tokens=4 delims= " %%G IN (C:\test.txt) DO ( IF DEFINED _c <nul set /p z=", " <nul set /p z=%%G SET _c=1
C:\test.txt
)
不用说,这真是一团糟。
但是,我想得到“unused”列的值,即111640
我的机器是Windows,我尝试了以下代码,但没有提供任何信息:
@echo off
SET _c=
FOR /F "tokens=4 delims= " %%G IN (C:\test.txt) DO (
IF DEFINED _c <nul set /p z=", "
<nul set /p z=%%G
SET _c=1
)
@echo关闭
集=
对于/F“tokens=4 delims=“%%G IN(C:\test.txt)DO(
如果定义了_c因为你的问题被标记了,那么
awk -F "|" "$NF ~ /unused/{p=1} p && /[0-9]/ { print $NF; p = 0 }" messyfile.txt
我希望双引号适用于Windows;在U*x上,我会始终使用单引号
-F
设置字段分隔符,NF
是字段数;$NF
检查每行的最后一个字段。如果在最后一个字段中看到未使用的
,请开始查找一个数字。当我们看到至少包含一个数字的行时,请打印该行的最后一个字段
如果这与您想要的足够接近,我相信您可以想出如何调整它,例如,删除thKB
后缀(提示:sub()
或split()
)。既然您的问题已被标记,那么
awk -F "|" "$NF ~ /unused/{p=1} p && /[0-9]/ { print $NF; p = 0 }" messyfile.txt
我希望双引号适用于Windows;在U*x上,我会始终使用单引号
-F
设置字段分隔符,NF
是字段数;$NF
检查每行的最后一个字段。如果在最后一个字段中看到未使用的
,请开始查找一个数字。当我们看到至少包含一个数字的行时,请打印该行的最后一个字段
如果这与您想要的足够接近,我相信您可以找到如何调整它,例如删除thKB
后缀(提示:sub()
或split()
)。请尝试以下操作(我还没有在windows环境中测试过)
PS:警告:我还没有在windows环境下测试过这个问题,请尝试以下内容(我还没有在windows环境下测试过这个问题)
PS:Fair warning我还没有在windows环境中测试过这个版本试试这个批处理/cmd版本:
@echo off
for /f "usebackq" %%i in (`for /f "tokens=4 delims=|" %%j in ^(C:\test.txt^) do @echo %%j`) do (
(echo %%i | findstr /R "[0-9][0-9]*" ) && set "thenum=%%i" && goto :outloop
)
:outloop
::echo %thenum%
::pause
该值还保存到变量thenum
,可在以后使用。尝试此批处理/cmd版本:
@echo off
for /f "usebackq" %%i in (`for /f "tokens=4 delims=|" %%j in ^(C:\test.txt^) do @echo %%j`) do (
(echo %%i | findstr /R "[0-9][0-9]*" ) && set "thenum=%%i" && goto :outloop
)
:outloop
::echo %thenum%
::pause
该值还保存到变量thenum
,以后可以使用。此.bat文件脚本可能会提供您想要的内容
powershell -NoLogo -NoProfile -Command ^
"Select-String -Path '.\test.txt' -Pattern '^\d+ .*\|\d+ .*\|\d+ .*\|(\d+).*$' |" ^
"ForEach-Object { $_.Matches.Groups[1].Value }"
这个.bat文件脚本可能会满足您的需要
powershell -NoLogo -NoProfile -Command ^
"Select-String -Path '.\test.txt' -Pattern '^\d+ .*\|\d+ .*\|\d+ .*\|(\d+).*$' |" ^
"ForEach-Object { $_.Matches.Groups[1].Value }"
这使您可以通过该值的名称访问输入文件中的所有数据:
$ cat tst.awk
BEGIN { FS = "[[:space:]]*[|][[:space:]]*" }
{ gsub(/^[[:space:]]+|[[:space:]]+$/,"") }
prev1 ~ /^[-|]+$/ {
split(prev2,tags)
for (i=1; i<=NF; i++) {
tag = tags[i]
val = $i
tag2val[tag] = val
}
}
{ prev2 = prev1; prev1 = $0 }
END {
for (tag in tag2val) {
val = tag2val[tag]
printf "%s = <%s>\n", tag, val
}
print "---"
print tag2val["unused"]
}
$ awk -f tst.awk file
reserved = <111360 KB>
unallocated space = <11157.80 MB>
database_name = <web>
data = <11560 KB>
database_size = <11120.00 MB>
index_size = <11160 KB>
unused = <111640 KB>
---
111640 KB
$cat tst.awk
开始{FS=“[:space:][]*[|][[:space:][]*”}
{gsub(/^[:space:][]+|[:space:][]+$/,“”)}
prev1~/^[-|]+$/{
拆分(prev2,标记)
对于(i=1;i,您可以通过该值的名称访问输入文件中的所有数据:
$ cat tst.awk
BEGIN { FS = "[[:space:]]*[|][[:space:]]*" }
{ gsub(/^[[:space:]]+|[[:space:]]+$/,"") }
prev1 ~ /^[-|]+$/ {
split(prev2,tags)
for (i=1; i<=NF; i++) {
tag = tags[i]
val = $i
tag2val[tag] = val
}
}
{ prev2 = prev1; prev1 = $0 }
END {
for (tag in tag2val) {
val = tag2val[tag]
printf "%s = <%s>\n", tag, val
}
print "---"
print tag2val["unused"]
}
$ awk -f tst.awk file
reserved = <111360 KB>
unallocated space = <11157.80 MB>
database_name = <web>
data = <11560 KB>
database_size = <11120.00 MB>
index_size = <11160 KB>
unused = <111640 KB>
---
111640 KB
$cat tst.awk
开始{FS=“[:space:][]*[|][[:space:][]*”}
{gsub(/^[:space:][]+|[:space:][]+$/,“”)}
prev1~/^[-|]+$/{
拆分(prev2,标记)
对于(i=1;i查看提供的文件内容,您实际上不需要复杂的搜索掩码:
@Echo关闭
设置“未使用=”
对于/F“Tokens=4 Delims=|”%%A In('Find“KB”^Nul'
)在(%%A)中为%%B执行如果未定义未使用设置“未使用=%%B”
如果定义为未使用(回显=%UnUsed%&暂停)
查看提供的文件内容,您实际上不需要复杂的搜索掩码:
@Echo关闭
设置“未使用=”
对于/F“Tokens=4 Delims=|”%%A In('Find“KB”^Nul'
)在(%%A)中为%%B执行如果未定义未使用设置“未使用=%%B”
如果定义为未使用(回显=%UnUsed%&暂停)
在批处理文件中,连续分隔符被计算为我将使用的分隔符
在命令行上
for /f "tokens=7 delims=| " %A in ('findstr "KB" C:\test.txt') do @set "unused_KB=%A"
在批处理文件中
@Echo off
for /f "tokens=7 delims=| " %%A in ('findstr "KB" C:\test.txt') do set "unused_KB=%%A"
在批处理文件中,连续分隔符被计算为我将使用的分隔符
在命令行上
for /f "tokens=7 delims=| " %A in ('findstr "KB" C:\test.txt') do @set "unused_KB=%A"
在批处理文件中
@Echo off
for /f "tokens=7 delims=| " %%A in ('findstr "KB" C:\test.txt') do set "unused_KB=%%A"
另一个(更简单)的,只是为了收藏
@echo off
setlocal
for /F "tokens=3" %%a in ('"setx /F test.txt dummyVar /R 2,3 unused /D ^|"') do set "col=%%a" & goto continue
:continue
set "col=%col:~0,-1%"
echo %col%
所需令牌位于搜索行下方两(2)行。所需令牌的行在搜索行中每行有两个令牌。因此,令牌偏移量为3(而不是0)
有关此方法的详细说明,请参阅
编辑:添加新方法
这个简单而标准的方法也可以工作,因为所需的值是文件中唯一的第七个标记
@echo off
for /F "tokens=7 delims=| " %%a in (test.txt) do set "col=%%a"
echo %col%
另一个(更简单)的,只是为了收藏
@echo off
setlocal
for /F "tokens=3" %%a in ('"setx /F test.txt dummyVar /R 2,3 unused /D ^|"') do set "col=%%a" & goto continue
:continue
set "col=%col:~0,-1%"
echo %col%
所需令牌位于搜索行下方两(2)行。所需令牌的行在搜索行中每行有两个令牌。因此,令牌偏移量为3(而不是0)
有关此方法的详细说明,请参阅
编辑:添加新方法
这个简单而标准的方法也可以工作,因为所需的值是文件中唯一的第七个标记
@echo off
for /F "tokens=7 delims=| " %%a in (test.txt) do set "col=%%a"
echo %col%
应该有一些方法可以使用FINDSTR
和参数/r
以及类似[0-9]*KB$
的正则表达式,您可以使用gawk
吗?这个文件是否以回车结束?应该有一些方法可以使用FINDSTR
和参数/r
以及类似[0-9]的正则表达式*KB$
你能使用gawk
吗?这个文件也是以回车结束的吗?@Tiw谢谢你的编辑。诅咒是移动键盘。当然,我发现了一个,但没有另一个。非常感谢你的帮助。我也会在我的Linux机器上使用它。@Tiw谢谢你的编辑。诅咒是移动键盘。当然,我发现了一个,但没有另一方面。非常感谢你的帮助。我也会在我的Linux机器上使用它。@Tiw,像tripleee先生一样,我已经在windows的情况下将change“
添加到”
。由于我没有windows环境,我现在在解决方案中添加了公平警告+我正在检查在线终端,如果我得到它来检查它是否运行(windows one)。你可以将你的awk
脚本放在一个单独的文件中,并使用awk-f该文件运行,从而绕过windows的大部分不足之处。
。:-)@MarkSetchell,酷,让我也来试试,非常感谢你让我知道,好吗