使用CMD、Powershell或GNU实用程序在第行和第列查找多个单词的简单方法
我试图确定使用CMD、Powershell或GNU实用程序在第行和第列查找多个单词的简单方法,powershell,batch-file,awk,sed,grep,Powershell,Batch File,Awk,Sed,Grep,我试图确定PowershellMeasure命令/运行时间结果的第4、第5、第6和第7行第三列的内容,并将这四个字分别写入四个单独的文本文件,稍后用作变量。这将在Windows批处理文件中完成,但我可以访问CMD、Powershell和GNU实用程序 我使用这个命令,但是插入了空值,有时它无法捕获值 sed -n 4p C:\Temp\ElapsedTime.txt > C:\Temp\ElapsedTime_Hours_Null.txt | cat C:\Temp\ElapsedTime
Powershell
Measure命令/运行时间结果的第4、第5、第6和第7行第三列的内容,并将这四个字分别写入四个单独的文本文件,稍后用作变量。这将在Windows批处理文件中完成,但我可以访问CMD、Powershell
和GNU实用程序
我使用这个命令,但是插入了空值,有时它无法捕获值
sed -n 4p C:\Temp\ElapsedTime.txt > C:\Temp\ElapsedTime_Hours_Null.txt | cat C:\Temp\ElapsedTime_Hours_Null.txt | tr -d '\000' > C:\temp\ElapsedTime_Hours.txt
我不知道这是否会更好
cat C:\Temp\ElapsedTime.txt | tr -d '\000' > C:\temp\ElapsedTimeConcatenated.txt
sed -n 4p C:\Temp\ElapsedTimeConcatenated.txt | awk "{print $3}" > c:\temp\Hours.txt
鉴于我对CMD、Powershell
和GNU实用程序的经验有限,我不知道最简单的方法
(Get-Content input.txt)[3,4,5,6] | ForEach { ($_ -Split '[^a-z]')[2] } | Set-Content ParticularName.txt
PowerShell索引基于0,并且Split()
采用空格分隔的列
帮助链接(如果可用):
- 获取内容是(在模块Microsoft.PowerShell.Management中)
- ForEach是的别名
- 设置内容为(在模块Microsoft.PowerShell.Management中)
(Get-Content input.txt)[3,4,5,6] | ForEach { ($_ -Split '[^a-z]')[2] } | Set-Content ParticularName.txt
PowerShell索引基于0,并且Split()
采用空格分隔的列
帮助链接(如果可用):
- 获取内容是(在模块Microsoft.PowerShell.Management中)
- ForEach是的别名
- 设置内容为(在模块Microsoft.PowerShell.Management中)
- PowerShell默认情况下创建UTF-16LE编码的文件(使用
/
和>
输出文件,而不使用
-Encoding`参数)
- GNU实用程序无法直接处理此类文件,因此需要将它们转换为UTF-8
- 只有当文件只包含ASCII字符时,您的
方法才会起作用tr-d'\0'
- 否则,首先将文件创建为UTF-8,或者使用转换实用程序,例如
iconv
- 只有当文件只包含ASCII字符时,您的
- 但是,如果PowerShell创建了输入文件,则使用PowerShell解决方案可能最容易,您无需担心文件的编码:
[timespan]
对象的文本格式表示,例如:
Days : 1
Hours : 12
Minutes : 30
Seconds : 45
Milliseconds : 400
Ticks : 1314454000000
TotalDays : 1.5213587962963
TotalHours : 36.5126111111111
TotalMinutes : 2190.75666666667
TotalSeconds : 131445.4
TotalMilliseconds : 131445400
如果是这种情况,则按属性名而不是按行索引进行解析更为稳健:
对于在批处理文件中使用GNU实用程序的基于的解决方案:
@echo off
setlocal
cd /d "c:\temp"
iconv -f UTF-16LE -t UTF-8 ElapsedTime.txt | tail -c+4 |^
awk "BEGIN { split(\"hours.txt:minutes.txt:seconds.txt:ms.txt\", names, \":\") } NR>=4 && NR<=7 { print $3 > names[++n] }"
- PowerShell默认情况下创建UTF-16LE编码的文件(使用
/
和>
输出文件,而不使用
-Encoding`参数)
- GNU实用程序无法直接处理此类文件,因此需要将它们转换为UTF-8
- 只有当文件只包含ASCII字符时,您的
方法才会起作用tr-d'\0'
- 否则,首先将文件创建为UTF-8,或者使用转换实用程序,例如
iconv
- 只有当文件只包含ASCII字符时,您的
- 但是,如果PowerShell创建了输入文件,则使用PowerShell解决方案可能最容易,您无需担心文件的编码:
[timespan]
对象的文本格式表示,例如:
Days : 1
Hours : 12
Minutes : 30
Seconds : 45
Milliseconds : 400
Ticks : 1314454000000
TotalDays : 1.5213587962963
TotalHours : 36.5126111111111
TotalMinutes : 2190.75666666667
TotalSeconds : 131445.4
TotalMilliseconds : 131445400
如果是这种情况,则按属性名而不是按行索引进行解析更为稳健:
对于在批处理文件中使用GNU实用程序的基于的解决方案:
@echo off
setlocal
cd /d "c:\temp"
iconv -f UTF-16LE -t UTF-8 ElapsedTime.txt | tail -c+4 |^
awk "BEGIN { split(\"hours.txt:minutes.txt:seconds.txt:ms.txt\", names, \":\") } NR>=4 && NR<=7 { print $3 > names[++n] }"
我在Powershell中尝试了上述命令,但我只得到了一个空白文本文件,或者我没有正确设置它。@noni我猜拆分不起作用,我编辑了我的答案,因此它现在对任何非字母字符的运行执行正则表达式拆分。这样做的可能性更大,但我猜不出它是否会做正确的事情。考虑编辑你原来的问题,包括一些你正在使用的文件内容的例子。我在PuthS壳中尝试了上面的命令,但是我只得到了一个空白的文本文件,或者我没有正确地设置它。我已经编辑了我的答案,所以它现在可以对任何非字母字符进行正则表达式拆分。这样做的可能性更大,但我猜不出它是否会做正确的事情。考虑编辑你原来的问题,包括一些你正在使用的文件内容的例子。我把你的代码保存为一个PosiScript脚本,并且能够用这个命令在Windows的批处理文件中运行它。我没有运行未签名Powershell脚本的计算机设置。非常感谢您的回答和Powershell专业技能!我希望其他人可以使用其他DOS或GNU实用程序来回答这个问题,以帮助那些不知道如何在Powershell中执行此操作的人。@noni:我添加了一个GNU实用程序/批处理文件解决方案-输出文件名可能与输入文件行索引不匹配(不确定您要查找的确切字段,以及输入文件中是否有空格,但您明白了。我鼓励您将问题弄清楚,以方便将来的读者。文本结果看起来是正确的,但当我使用以下内容时--set/p Hours=@noni:听起来您正在读取的文件实际上仍然是UTF-16LE文件,而不是UTF-8/ASCII。
ÿþ
是UTF-16LE BOM(字节顺序标记)的打印方式。我已更新了答案,以说明如何删除此BOM-使用iconv
和使用tr-d“\0”
-仅限ASCII快捷方式。您必须先将文件设置为UTF-8/ASCII。如果您的文件仍然是UTF-16LE,则cmd.exe
看到的任何内容都将在第一个NUL
处被切断,这将位于第一个数据字节之后。如果您仍然有问题,请使用。我将您的代码保存为Powershell scr并且能够得到我