Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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
使用CMD、Powershell或GNU实用程序在第行和第列查找多个单词的简单方法_Powershell_Batch File_Awk_Sed_Grep - Fatal编程技术网

使用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中)
PowerShell

(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
      • 但是,如果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
      • 但是,如果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并且能够得到我