Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/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
Shell 从2个文本文件中提取不同的行并附加到新文件_Shell_Powershell - Fatal编程技术网

Shell 从2个文本文件中提取不同的行并附加到新文件

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~更多数据 基本上,我正在尝试创建一个新文件,其中包含来自两个文件的非重复行数据,

我有两个文本文件,其中一个名为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文件获取内容并选择不相等的对象

$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看到了他的第一条评论