比较shell脚本中的2个文件

时间:2017-03-06 11:46:50

标签: bash shell unix awk

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

第一个文件是一个简单的文本文件--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和diff,甚至使用awk。但到目前为止无法获得所需的结果

@triplee @ghoti。

好的同意,也许我应该举例说明我正在使用的命令 在awk的不同时间,我是 -
使用$ 1而不是$ 0或
不使用{print}或
使用选项-F';'而不是-F'“;”'或。
我试过'NR == FNR {c [$ 1] ++; next}; c [$ 5]> 0'。

我尝试使用通讯23 有一些例子,我现在不记得了,我在各种网站上找到grep,但是在File1.txt中打印了所有值

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 版本中可用。

答案 2 :(得分:0)

cutsort&amp; uniq

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

输出:

C2 D2
E3 F3
I5 J5

注意:鉴于 file2.txt 的格式,cut分隔符和字段可以是“;”和“5”,但使用' "'和'10'保存了过滤 file2.txt 的双引号的额外步骤。