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



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

下面的awk解决方案将只打印来自file1file2的匹配数据。我需要一些存在于文件1中但不存在于文件2中的数据。

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

file1

papaya
apple
Moosumbi
mango
jackfruit
kiwi
orange
strawberry
banana
grapes
dates

file2

apple
mango
kiwi
strawberry

预期结果:-

papaya
Moosumbi
jackfruit
orange
banana
grapes
dates

命令diff就是为了这个目的。刚刚发布:

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

你会得到预期的结果:

papaya
Moosumbi
jackfruit
orange
banana
grapes
dates

这对我有效

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

这意味着条件FNR==NR仅适用于第一个文件,因为对于每个文件的第一行,FNR重置回1,但NR继续增加。

f2[$1]本身的唯一目的是创建由$1索引的数组元素,即使我们没有为它分配任何值。在传递第一个文件2的过程中,所有看到的行都被记住为数组f2的索引。对第二个文件1的传递只需要检查被读取的每一行是否都不作为索引存在于数组f2中[这就是条件!($0 in f2)的作用]。如果条件为true,则打印从文件2中读取的行。

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

最新更新