【问题标题】:Deleting repeated word pairs in opposite order以相反的顺序删除重复的单词对
【发布时间】:2018-05-28 20:02:53
【问题描述】:

我有一个类似这个例子的文件:

cat dog
mouse cat
dog cat
dog mouse

我想要的是删除那些包含相同单词但顺序相反的行,在这种情况下,我想要“cat dog”而不是“dog cat”。在真实文件中,我有大量的单词对(交互),我想删除冗余(我正在处理单向交互)。因此,我想要这个结果:

cat dog
mouse cat
dog mouse

我试过了,但它没有返回任何结果:

cat file | while read f1 f2; do awk -F" " '($1==$f2) && ($2==$f1)' file; done

在这段代码中,我只想找到重复的对。要删除重复,我会这样做:

cat file | while read f1 f2; do awk -F" " '($1!=$f2) && ($2!=$f1)' file; done

【问题讨论】:

  • 我想要“cat dog”而不是“dog cat”为什么不反过来呢?
  • 其实没关系。我想要“猫狗”或“狗猫”,但不是两者。

标签: linux bash awk while-loop


【解决方案1】:

关注awk 可能对您有所帮助。

awk '{b[$1,$2]} !($2,$1) in b' Input_file

【讨论】:

  • Bash 返回错误:'syntax error at or near ,'。
  • 尝试使用额外的一组括号,如下所示:'{b[$1,$2]} !(($2,$1) in b)'
  • @jas 我删除了我自己的答案,因为您对哈希表的看法是正确的。为这个 +1。
  • @Swimmingbird,你能告诉我删除这个正确答案的原因吗?那我可以试着改进一下吗?
  • 另一个答案花费的时间更少,尽管事实上,这两个都可以正常工作。
【解决方案2】:

常见的惯用解决方案:

$ awk '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
cat dog
mouse cat
dog mouse

【讨论】:

  • awk remove duplicates seen site:stackoverflow.com。我看不到这个问题的价值,给出的答案已经被问过很多次,但我不是专家。我很惊讶数百个潜在的重复项没有给出答案。
  • 当有人发布 awk 问题时,我有 2 个选择:1) 搜索档案以查看以前是否曾提出过类似的问题,如果是,是否提供了对该问题的任何答案是实际的正确答案,如果是这样,但正确答案不是公认的答案(经常!)决定我是否真的想将此问题标记为该问题的重复,这意味着我实际上是在将人们引向错误的答案或2)发布正确的解决方案。选项 2 对我来说要容易得多,如果选项 1 对我来说很难,我只能想象对初学者来说有多难。
  • 正如我在另一篇文章中所说,这是根本问题:Please incentivize duplicate finding when gold badge closes as dup。这是简单的经济学。提供答案而不是做工作更有利可图。这告诉 OP 提出问题而不是做工作是有利可图的。从更大的角度来看,它使网站充满了无用的垃圾。 1000刀就是死亡。这就是为什么有数百个类似问题的原因。
  • 不,这与利润无关,与时间有关。我有时间发布一个简单的正确解决方案。我没有时间在网站上搜索与其他问题中接受的答案相同的解决方案。因此,鉴于我愿意在 SO 上花费多少时间,我的选择是回答或忽略这个问题,恕我直言,回答它比忽略它更有帮助,所以这通常是我选择做的。如果其他人有时间在档案中搜索相同的解决方案并将问题作为一个副本关闭,那么他们将拥有更多权力。
  • 只有当人们关心所涉及的货币时,经济模型才适用。在某些网站上关心无价值点是非常困难的。如果我们谈论的是美元或欧元之类的东西,那么我可能会在意。我回答的问题根本不是题外话,因此关闭它们对任何人都没有帮助,我想大多数人参与 SO 是为了帮助人们,而不是收集毫无意义的点数。不过,做你喜欢的事 - 我的方法很好,谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 2016-04-19
  • 2018-10-13
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多