Bash (硬)Shellscript中列表之间的比较
嗯,我觉得很难。也许你会发现这很容易 我有两个文件:BUYINGORDERS,PRODUCTMASTERLIST BuyingOrder(ProductID、ProductDescription)如下所示: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
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的新鲜可乐瓶”
当然,我不是要你做我的家庭作业(虽然我不会抱怨:),但我非常感谢你在这件事上至少采取一种可能的方法
通过对这些值进行排序,您可以依靠“新鲜。*可口可乐”匹配“新鲜可口可乐”和“新鲜该死的可口可乐”好的-在不给您完整答案的情况下,我将如何处理它:
IFS
在分号处拆分行bWords=(${bDesc})
);在${pWords[@]}中的pWords使用do;do…
)bWord==pWord
时,递增一个计数器。如果计数器达到bWords
中的字数,则表示您已满足条件continue
)-我最近了解到,你可以使用continue 2
从内循环移动到外循环的下一次迭代。这很好。)这是一个蛮力搜索,所以效率不高。如果文件很大,速度可能会变慢。另一种方法是使用每个描述的单词对其进行散列-如果您对如何生成散列很在行,您甚至可以使用二进制AND操作查看一个描述是否“包含”在另一个描述中。但我不确定Bash是否真的能做到这一点:)dannysauer,这是一个出色的计划,我正在继续这个计划。在第一次测试中,我尝试性地通过你的步骤找到了巧合,这似乎很有效。你帮了我很多忙!谢谢我很高兴这有帮助。:)如果要比较文件,对它们进行排序,并使用
comm
确定仅在一行或另一行中的行也很方便。我不建议在这里这样做,因为你会有大量的临时文件。但对于类似的情况,这是一个很方便的工具。如果不是@dannysauer的答案(我已经开始了),我会尝试这个,因为它看起来是一个非常可靠的想法。我非常感谢你,dsl101!为什么要投否决票?我说了什么?