Shell 从2个文本文件中提取不同的行并附加到新文件
我有两个文本文件,其中一个名为Invoice1.txt,另一个名为Invoice2.txt。两个文件的格式相同 Invoice1.txt包含: H~30011000~更多数据 L~13332~更多数据 L~13332~更多数据 和Invoice2.txt包含: H~30011000~更多数据 L~13332~更多数据 L~13332~更多数据 H~30022000~更多数据 L~13999~更多数据 L~13999~更多数据 基本上,我正在尝试创建一个新文件,其中包含来自两个文件的非重复行数据,如下所述。Invoice2.txt中的最后3行不在Invoice1.txt中,因此将附加到新文件中 我期望的结果是: H~30022000~更多数据 L~13999~更多数据 L~13999~更多数据 我将如何使用Powershell编写它。我是否必须为这两个.txt文件获取内容并选择不相等的对象Shell 从2个文本文件中提取不同的行并附加到新文件,shell,powershell,Shell,Powershell,我有两个文本文件,其中一个名为Invoice1.txt,另一个名为Invoice2.txt。两个文件的格式相同 Invoice1.txt包含: H~30011000~更多数据 L~13332~更多数据 L~13332~更多数据 和Invoice2.txt包含: H~30011000~更多数据 L~13332~更多数据 L~13332~更多数据 H~30022000~更多数据 L~13999~更多数据 L~13999~更多数据 基本上,我正在尝试创建一个新文件,其中包含来自两个文件的非重复行数据,
$file1 = "C:\Invoice1.txt"
$file2 = "C:\Invoice2.txt"
$results = "C:\NonDuplicate.txt"
实现这一目标有多种方法。但我为你们做了一个简单的解释,并在每一行解释了事情是如何运作的 下面是供您参考的脚本和屏幕截图
# Taking input from both the files
$file1= Get-Content E:\Source_Test\invoice1.txt
$file2= Get-Content E:\Source_Test\invoice2.txt
# Ignoring the case sensitivity . So making it to lowercase. Parsing it to get non duplicates in each file and appendind the result to the file
($file1).tolower() |sort | Get-Unique | Out-File E:\source_test\NonDuplicate.txt -Append -Force
($file2).tolower() |sort | Get-Unique | Out-File E:\source_test\NonDuplicate.txt -Append -Force
# Getting the data from both the files and again taking the non-duplicates and finally storing in the file
$file3=Get-Content E:\Source_Test\NonDuplicate.txt
($file3).ToLower() | sort | Get-Unique | Out-File E:\Source_Test\nonduplicate.txt -Force
图像:
希望它有助于……编辑适应OPs预备课程的内容
$file1 = ".\Invoice1.txt"
$file2 = ".\Invoice2.txt"
$results = ".\NonDuplicate.txt"
$Content = Get-Content $File1
Get-Content $File2 |
ForEach { if ($Content -notcontains $_) {$_} }|
Set-Content $Results
这是另一个更简单的步骤:
Get-Content $File2 | Where {$Content -notcontains $_}| Set-Content $Results
输出
> cat .\NonDuplicate.txt
H~30022000 ~More Data...
L~13999 ~More Data...
L~13999 ~More Data...
其他建议,无论您有多少文件都有效
$dirwithfile="C:\temp\test"
#extract list of files
$listfile=gci "$dirwithfile\Invoice*.txt" -file
#for every file, get content and extract only rows which not exist in other content file, write result into file NonDuplicate.txt
$listfile |
%{ $filename=$_.Name; gc $_ | where {$row=$_; ($listfile | where Name -ne $filename | gc) -notcontains $row } } |
out-file "$dirwithfile\NonDuplicate.txt" -Append
如果文件很小,那么
Compare Object
将非常适合此用途
Compare-Object -ReferenceObject (Get-Content $file1) -DifferenceObject (Get-Content $file2) -PassThru |
Set-Content $results
这将通过少量的编码提供您想要的结果。它似乎有空白行的问题,所以您可能需要根据您想要的结果对其中的一些行进行后期处理-PassThru
存在,因此可以避免比较对象
通常生成的自定义对象。相反,不匹配的线被推过。您可以对文件内容使用临时变量,但如果只使用一次,又何必麻烦呢
Compare-Object -ReferenceObject (Get-Content $file1) -DifferenceObject (Get-Content $file2) -PassThru |
Where-Object{![string]::IsNullOrWhiteSpace($_)}
如果您的文件较大,则这可能是无效的 嗨,谢谢!.toLower()不是必需的,因为行数据将始终完全相同,也不需要对其进行排序。但那无关紧要。无论如何,输出应该是Invoice2.txt中的最后3行,因为它们不在Invoice1.txt中。那太好了。:)如果您至少有v3,则只需执行排序对象-唯一。你应该再读一次OPs帖子,因为这不符合要求。他希望两个文件的行都是唯一的。您只是在擦洗重复的行。@马特:我可以知道哪一行返回重复的值吗?non-duplicate.txt只返回唯一的值。第二,如果你看了这篇文章,我只提到了tolower(),这不是他的姿势所必需的。除此之外,一切都是正当的。请你再看一遍,不要像这样指着它。这是非常粗鲁和无礼的。你的输出与他在第一次评论中所说的OP不匹配。他没有在两个文件的组合中寻找唯一的行。他正在寻找两种语言中都没有的句子。至于你剩下的代码,我所要做的就是展示在哪里可以提高效率。这既不粗鲁也不无礼。这是一位同事试图帮助你。谢谢!但是,输出应仅为Invoice2.txt中的最后3行。因此,唯一性不起作用:(.应该是两个文件中没有的任何行。更改脚本以满足您的期望。嗯…这不会返回来自
$file1
的唯一值…仅返回来自$File2
的值。op示例数据没有任何值,但问题涉及两个文件。仅供参考,您需要使用@matt让我查看您的响应。从问题:本质上,我试图做的是创建一个新文件,其中包含两个文件中的非重复行数据,如下所述。正如我所说,示例数据不考虑这种可能性,但OP确实要求这样做。@matt看到了他的第一条评论