合并文本文件和前置文件名和行号 - Powershell

时间:2015-06-09 23:08:50

标签: powershell text powershell-v3.0

我一直在努力调整这个问题的答案:powershell - concatenate N text files and prepend filename to each line

我想要的输出基于2个.txt文件的示例:

First.txt 的线
数据

Second.txt
更多行 的

数据

Output.txt的
第1行
First2数据
第二行1
第二期
第二个数据

基于最相似的问题,我可以找到以下答案:

Select-String '^' *.txt >output.txt

会给:
C:\ A \ Filepath \ First.txt:1:行
C:\ A \文件路径\ First.txt:2:数据
C:\ A \ Filepath \ Second.txt:1:更多行
C:\ A \文件路径\ Second.txt:2:的
C:\ A \文件路径\ Second.txt:3:数据

所以我希望使用-replace来删除文件路径,保留文件名(但删除.txt :),保留行号(但用空格替换final:)并保留行中的文本。

任何帮助将不胜感激达到所需的output.txt。感谢

2 个答案:

答案 0 :(得分:1)

不漂亮,但这是一种方法。

Get-ChildItem *.txt |
%{$FILENAME=$_.BaseName;$COUNT=1;get-content $_ |
%{"$FILENAME"+"$COUNT"+" " + "$_";$COUNT++}}|
Out-File Output.txt

答案 1 :(得分:1)

select-string方法非常有趣。我的方法是使用Get-Content。优点是每行都有readcount属性,表示行号。

Get-ChildItem "C:\temp\*.file" | ForEach-Object{
    $fileName = $_.BaseName
    Get-content $_ | ForEach-Object{
        "{0}{1} {2}" -f $fileName,$_.ReadCount,$_
    }
} | Add-Content "C:\temp\output.txt"

获取每个文件并使用Get-Content。对于我们处理的每一行,我们向输出流发送与您所需输出匹配的格式化行。无需计算$_.ReadCount已经知道的行。

Select-String仍可使用

您只需要操纵输出以匹配您想要的输出。使用Get-Member,我们可以检查select-string返回的属性以获得所需的输出。

Select-String '^' "c:\temp\*.txt" | ForEach-Object{
    "{0}{1} {2}" -f $_.Filename,$_.LineNumber,$_.Line
} | Add-Content "C:\temp\output.txt"