比较两个文件时打印不匹配的字符串 awk/grep/sed

To print un-matching strings when compared from two files awk/grep/sed

有两个文件 file1file2 这两个文件包含一些相似的数据。其中 file1 有一些 file2 中不存在的额外数据。我正在尝试打印那些额外的数据

以下 awk 解决方案将仅打印来自 file1file2 的匹配数据。我需要 file1 中存在但 file2 中不存在的数据。

awk 'NR==FNR{patts[]=;next}{for (i in patts) if (([=11=] ~ i) && ([=11=] ~ patts[i])) print}' file2 file1 

文件 1

papaya
apple
Moosumbi
mango
jackfruit
kiwi
orange
strawberry
banana
grapes
dates

文件2

apple
mango
kiwi
strawberry

预期结果:-

papaya
Moosumbi
jackfruit
orange
banana
grapes
dates

这对我有用

awk -F, 'FNR==NR {f2[];next} !([=10=] in f2)' file2 file1

这意味着条件 FNR==NR 仅对第一个文件为真,因为 FNR 在每个文件的第一行重置回 1,但 NR 不断增加。

f2[$1] 的唯一目的是创建由 $1 索引的数组元素,即使我们没有给它赋值。在遍历第一个文件 2 期间,所有看到的行都被记住为数组 f2 的索引。通过第二个 file1 只需要检查正在读取的每一行是否作为数组 f2 中的索引存在 [这就是条件 !([=11=] in f2) 所做的]。如果条件为真,则打印从 file2 读取的行。

条件 FNR==NR 与 NR==FNR 比较相同的两个操作数,因此其行为方式相同。

命令 diff 就是为此目的而制作的。刚刚发布:

diff --changed-group-format='%<' --unchanged-group-format='' file1 file2

你会得到预期的结果:

papaya
Moosumbi
jackfruit
orange
banana
grapes
dates