2017-03-06 83 views
0

我需要一些帮助来找到使用shell脚本的2个文件之间的区别。在shell脚本中比较2个文件

第一个文件是一个简单的文本文件 - FILE1.TXT

A1 B1 
C2 D2 
E3 F3 
G4 H4 
I5 J5 
K6 L6 

另一种是一个CSV文件 - File2.csv

"Line1";"BB";"ZZ";"12";"A1 B1";"190";"123";"1000";"qw1" 
"Line2";"KH";"YY";"78";"K6 L6";"45";"546";"234";"sgsd4" 
"Line3";"JJ";"LY";"77";"G4 H4";"32";"12";"213";"sdg12" 

我的要求是找到,如果每一行在File1.txt存在于File2.csv(在第5列)如果不是那么写它到一个单独的文本文件说,Result.txt

因此预期结果在的Result.txt会 -

C2 D2 
E3 F3 
I5 J5 

我一直在试图用grep和差异,甚至使用awk。但到目前为止无法得到所需的结果

@triplee @ ghoti。

好的同意,可能是我应该给我使用的命令的例子。
在使用awk不同的时间我是 -
使用$ 1而不是$ 0或
未使用{}打印或
与选项-F“;”而不是-F'“;”'或。
我试着'NR == FNR {c [$ 1] ++; next}; c [$ 5]> 0'。

我试过使用通讯23。
有一些例子,我现在不记得了,使用grep我各种网站上找到,但被印刷在FILE1.TXT

+2

即使不起作用,您也应该向我们展示您所尝试过的内容。如果你的尝试完全没有希望,那么需要一种不同的答案,如果你在那里99%。 – tripleee

+0

对tripleee的评论+1。你有什么尝试?我们大多数人都很乐意帮助你改进自己的技艺,但不愿意担任短期无偿编程人员。在[MCVE](http://stackoverflow.com/help/mcve)中向我们展示您的工作,您期待的结果以及您获得的结果,我们将帮助您弄清楚。 – ghoti

回答

3
awk -F'";"' 'FNR==NR {a[$0];next} 
         {if ($5 in a) delete a[$5]} 
      END  {for (i in a) {print i}}' file1 file2 

所有的值,我们存储第一个文件的行。解析第二个时,我们删除在特定列中找到的任何一个。最后,我们打印出阵列中剩下的部分。

,或者我们可以改变文件的顺序(这可能更快):

awk -F'";"' 'FNR==NR {a[$5];next} !($0 in a) {print $0}' file2 file1 
+0

第二个选项已经运行并且相当快。我之前正在尝试使用类似的awk命令,认为我可能犯了一个小错误。 –

0

我这样做:

grep -vf <(grep -Po '[A-Za-z]\d [A-Za-z]\d' File2.csv) File1.txt 

在括号内的命令(grep -Po '[A-Za-z]\d [A-Za-z]\d' File2.csv)会从csv文件模式(我假设他们总是在上面的格式:“LetterNumberSpaceLetterNumber”)。它的输出是:然后

A1 B1 
K6 L6 
G4 H4 

第二grep的检查,如果这些模式中FILE1.TXT和-v选项反转它,只显示非匹配线:

C2 D2 
E3 F3 
I5 J5 

PS:注意,-P选项是使用Perl兼容的正则表达式,因此请检查它是否可用于您正在使用的grep版本。

0

随着cutsort & uniq

cut -d'"' -f 10 file2.txt | sort - file1.txt | uniq -u 

输出:

C2 D2 
E3 F3 
I5 J5 

注:鉴于FILE2.TXT的格式,在cut分隔符和字段可能是 ';' 和'5',但使用'"'和'10' aves额外的步骤过滤掉file2.txt的双引号。