我需要一些帮助来找到使用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中打印了所有值
答案 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)
cut
,sort
&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 的双引号的额外步骤。