Bash (硬)Shellscript中列表之间的比较

Bash (硬)Shellscript中列表之间的比较,bash,shell,comparison,Bash,Shell,Comparison,嗯,我觉得很难。也许你会发现这很容易 我有两个文件:BUYINGORDERS,PRODUCTMASTERLIST BuyingOrder(ProductID、ProductDescription)如下所示: 1;fresh coke bottle 1 lt 2;cheese CheesyBrand yellow 2 kg 3;little newborn puppies 10 kg CheesyBrand yellow cheap cheese 2 kg;3.40 bottle of

嗯,我觉得很难。也许你会发现这很容易

我有两个文件:BUYINGORDERS,PRODUCTMASTERLIST

BuyingOrder(ProductID、ProductDescription)如下所示:

1;fresh coke bottle 1 lt
2;cheese CheesyBrand yellow 2 kg
3;little newborn puppies 10 kg
CheesyBrand yellow cheap cheese 2 kg;3.40    
bottle of very fresh coke of 1 lt;2.90
PRODUCTMASTERLIST(ProductDescription,Price)如下所示:

1;fresh coke bottle 1 lt
2;cheese CheesyBrand yellow 2 kg
3;little newborn puppies 10 kg
CheesyBrand yellow cheap cheese 2 kg;3.40    
bottle of very fresh coke of 1 lt;2.90
我需要找到PRODUCTMASTERLIST中存在的BUYINGORDERS中的描述。正如您所看到的,事实上,行并不是完全相同的:匹配的条件是BUYINGORDERS的ProductDescription中条目中的每个单词都应该在PRODUCTMASTERLIST的ProductDescription中按任意顺序排列。PRODUCTMASTERLIST中的条目甚至可能有更多的单词

因此,尽管略有不同,BUYINGORDERS中的第1行与PRODUCTMASTERLIST中的第2行相匹配,因为单词“新鲜”、“可口可乐”、“瓶子”、“1”和“lt”属于“1 lt的新鲜可乐瓶”

当然,我不是要你做我的家庭作业(虽然我不会抱怨:),但我非常感谢你在这件事上至少采取一种可能的方法

  • 提取你关心的整个领域
  • 对每个字段中的值进行排序
  • 在较短字符串中的每个值之间插入“*”
  • 使用在较长排序字符串中查找已修改的较短排序字符串 任何支持regexp的

  • 通过对这些值进行排序,您可以依靠“新鲜。*可口可乐”匹配“新鲜可口可乐”和“新鲜该死的可口可乐”

    好的-在不给您完整答案的情况下,我将如何处理它:

  • 找出哪个文件可能更小——您可能需要将一个文件读入一个数组,然后循环另一个文件的每一行进行比较
  • 使用
    IFS
    在分号处拆分行
  • 将描述转换为单词数组(例如,
    bWords=(${bDesc})
  • 现在,您可以计算购买订单描述中的字数
  • 在BUYINGORDERS描述中查找每个单词,然后在PRODUCTMASTERLIST中为每个单词使用嵌套循环(例如${bWords[@]}中的bWords使用
    ;在${pWords[@]}中的pWords使用do;do…
  • 每次发现
    bWord==pWord
    时,递增一个计数器。如果计数器达到
    bWords
    中的字数,则表示您已满足条件
  • 特别注意两种描述中的重复单词-你不想数到两次并产生误报(例如,在找到匹配项时使用
    continue
    )-我最近了解到,你可以使用
    continue 2
    从内循环移动到外循环的下一次迭代。这很好。)

  • 这是一个蛮力搜索,所以效率不高。如果文件很大,速度可能会变慢。另一种方法是使用每个描述的单词对其进行散列-如果您对如何生成散列很在行,您甚至可以使用二进制AND操作查看一个描述是否“包含”在另一个描述中。但我不确定Bash是否真的能做到这一点:)

    dannysauer,这是一个出色的计划,我正在继续这个计划。在第一次测试中,我尝试性地通过你的步骤找到了巧合,这似乎很有效。你帮了我很多忙!谢谢我很高兴这有帮助。:)如果要比较文件,对它们进行排序,并使用
    comm
    确定仅在一行或另一行中的行也很方便。我不建议在这里这样做,因为你会有大量的临时文件。但对于类似的情况,这是一个很方便的工具。如果不是@dannysauer的答案(我已经开始了),我会尝试这个,因为它看起来是一个非常可靠的想法。我非常感谢你,dsl101!为什么要投否决票?我说了什么?