【问题标题】:To print un-matching strings when compared from two files awk/grep/sed从两个文件 awk/grep/sed 比较时打印不匹配的字符串
【发布时间】:2021-09-23 11:23:47
【问题描述】:

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

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

awk 'NR==FNR{patts[$1]=$2;next}{for (i in patts) if (($0 ~ i) && ($0 ~ 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

【问题讨论】:

  • 感谢您分享您的努力,请在您的问题中添加输入和预期输出示例,以便更好地理解问题,谢谢。
  • @RavinderSingh13 我已添加示例供您参考。谢谢
  • 再一次,到目前为止,这个论坛上最常见的问题。请查看现有答案。

标签: awk sed grep data-extraction


【解决方案1】:

这对我有用

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

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

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

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

【讨论】:

    【解决方案2】:

    命令 diff 就是为了这个目的。只需发出:

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

    你会得到预期的结果:

    papaya
    Moosumbi
    jackfruit
    orange
    banana
    grapes
    dates
    

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 2017-08-26
      • 2021-06-15
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多