Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何获得非常非标准格式文本文件的必要值?_Windows_Batch File_Awk_Cmd - Fatal编程技术网

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
检查每行的最后一个字段。如果在最后一个字段中看到
未使用的
,请开始查找一个数字。当我们看到至少包含一个数字的行时,请打印该行的最后一个字段


如果这与您想要的足够接近,我相信您可以想出如何调整它,例如,删除th
KB
后缀(提示:
sub()
split()
)。

既然您的问题已被标记,那么

awk -F "|" "$NF ~ /unused/{p=1} p && /[0-9]/ { print $NF; p = 0 }" messyfile.txt
我希望双引号适用于Windows;在U*x上,我会始终使用单引号

-F
设置字段分隔符,
NF
是字段数;
$NF
检查每行的最后一个字段。如果在最后一个字段中看到
未使用的
,请开始查找一个数字。当我们看到至少包含一个数字的行时,请打印该行的最后一个字段


如果这与您想要的足够接近,我相信您可以找到如何调整它,例如删除th
KB
后缀(提示:
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,酷,让我也来试试,非常感谢你让我知道,好吗