(硬)比较Shell脚本中的列表

时间:2014-04-30 19:06:46

标签: bash shell comparison

嗯,我认为很难。也许你会发现它很容易。

我有两个文件:BUYINGORDERS,PRODUCTMASTERLIST

BUYINGORDERS(ProductID,ProductDescription)是这样的:

1;fresh coke bottle 1 lt
2;cheese CheesyBrand yellow 2 kg
3;little newborn puppies 10 kg

PRODUCTMASTERLIST(ProductDescription,Price)是这样的:

CheesyBrand yellow cheap cheese 2 kg;3.40    
bottle of very fresh coke of 1 lt;2.90

我需要在PRODUCTMASTERLIST中找到BUYINGORDERS中的描述。正如你所看到的那样,那些线条并不完全相同:匹配的条件是购买者中条目中的每个单词。 ProductDescription应该在PRODUCTMASTERLIST的ProductDescription中有任何订单。 PRODUCTMASTERLIST中的条目甚至可能包含更多单词。

所以,尽管略有不同,BUYINGORDERS的第1行与PRODUCTMASTERLIST的第2行相匹配,因为单词“fresh'”,“coke'”,“'瓶子'”,& #39; 1'和' lt'是#1瓶中非常新鲜的可乐瓶。

现在,我不是要求你做我的作业(当然,我不会抱怨),但我会非常感谢至少可能采取的措施。

2 个答案:

答案 0 :(得分:0)

  1. 提取您关心的整个字段
  2. 对每个字段中的值进行排序
  3. 坚持"。*"在较短的字符串中的每个值之间
  4. 使用更长的排序字符串查找修改后的较短排序字符串 什么支持regexps
  5. 通过对值进行排序,您可以依赖" fresh。* coke"匹配"新鲜可乐"和#34;新鲜的friggin'焦炭"

答案 1 :(得分:0)

好的 - 没有给你完整的答案,我在这里解决它:

  1. 找出哪个文件可能更小 - 您可能需要将一个文件读入一个数组,然后绕另一个文件的每一行循环进行比较
  2. 使用IFS拆分分号
  3. 将说明转换为单词数组(例如bWords=( ${bDesc} )
  4. 现在您可以计算购买者描述中的单词数量
  5. 在BUYINGORDERS描述中查找每个单词,然后使用PRODUCTMASTERLIST中每个单词的嵌套循环(例如for bWord in ${bWords[@]}; do for pWord in ${pWords[@]}; do ...
  6. 每次找到bWord == pWord时,都会增加一个计数器。如果计数器达到bWords中的字数,则表示您符合条件
  7. 在任何一个描述中特别注意重复的单词 - 你不想计算它们两次并产生误报(例如,当找到匹配时使用continue - 我最近了解到你可以使用{ {1}}从内循环移动到外循环的下一次迭代。这很好。)
  8. 这是一次蛮力搜索,因此效率不高。如果文件很大,可能会变慢。另一种方法是使用它来对每个描述进行哈希处理 - 如果你对如何生成哈希很聪明,你甚至可以使用二进制AND运算来查看是否包含了一个描述&# 39;在另一个。但我不确定Bash真的能做到这一点:)