【问题标题】:Finding repeated names in a file在文件中查找重复的名称
【发布时间】:2017-11-30 19:44:43
【问题描述】:

嗨,我有一个包含姓氏和人名的 txt 文件,现在我想使用 egrep 只显示具有相同姓氏的人的名字。我不知道我怎么能做到这一点。感谢帮助 我的 txt 看起来像这样:

snow john
snow jack
miller george
mcconner jenny

输出应该是:

john 
jack

我目前已尝试运行:

cat names.txt | cut -d " " -f 1 | awk 'seen[$]++' 

...但这失败并出现错误:

awk: syntax error at source line 1
 context is
     >>> seen[$] <<<
awk: bailing out at source line 1

【问题讨论】:

  • 听起来像是 sort 的工作
  • 您想按姓氏分组并显示具有多个成员的组,或者您想选择所有具有特定姓氏的人姓名?
  • 我想让他们按姓氏分组,但只显示具有相同姓氏的所有成员的名字。
  • 你尝试了什么?
  • 通过编辑您的问题显示示例数据和预期输出。

标签: linux bash awk grep


【解决方案1】:

您可以通过awk 使用典型的 2-pass 方法:

awk 'NR == FNR {freq[$1]++; next} freq[$1]>1{print $2}' file file

john
jack

参考:Effective AWK Programming

【讨论】:

  • 如果文件中有重复的条目,这将不起作用,比如两个snow john
  • 我没有看到有问题的全名重复的情况。如果 op 有这种情况,我可以轻松调整此命令。
  • 假设两个人可能有相同的名字是有道理的,所以你可以稍微调整一下..
  • 我刚刚意识到它已经在处理重复的名称条目。如果 OP 允许重复的全名并且预期的输出是其他内容,请更新问题或评论。
【解决方案2】:

awk 是你的朋友。使用单通道方法,您可以使用一种将最后一条记录存储在变量中的内存技术来实现您的结果

给定一个输入文件如下:

$ cat file
snow john
snow jack
miller tyler
snow leopard
kunis ed
snow jack
snow miller
snow miller
sofo mubu
sofo gubu

...以下 shell 命令使用单个 awk 传递来生成正确的输出:

$ awk 'count1[$1]==1 && ++count2[name[$1]]==1{print fn} # replica of next step with prev record values
       count1[$1]++ && ++count2[$2]==1{print $2} # our main logic
       {name[$1]=$2} # Here,we keep a copy of current record for next passes
      ' file
john
jack
leopard
miller
mubu
gubu

注意:最终答案包括[ this ]评论中提到的 @ordoshsen 的建议。有关 awk 的更多信息,请参阅 [ the manual ]

【讨论】:

  • 你不能用这种态度打印重复的名字中的第一个
  • @Ordoshsen, ...好吧,如果你有第二遍,这个可以被采用——例如,如果你使用了这个awk代码生成的流作为输入文件(进程替换等)传递给grep-f 参数作为要搜索的单词列表(使用适当的其他选项——-F-w,也许?)。所以它需要工作,但它可以挽救的。
  • @CharlesDuffy 我们可能会使用记忆方法来防止第二次通过。请查看更新后的答案。
  • @Ordoshsen 请查看更新后的答案,其中介绍了更多条件和一些程序内存。
  • @sjsam 我讨厌成为那个人,但既然你付出了努力......当你输入例如'snow john,smith jack,snow jim'时它仍然失败,因为它只是打印 jim 而不是 john。我冒昧地稍微改变了你的剧本。 awk 'count1[$1]==1 &amp;&amp; ++count2[name[$1]]==1{print name[$1]} count1[$1]++ &amp;&amp; ++count2[$2]==1{print $2} {name[$1]=$2}' 不管怎样我现在对你的回答很满意
猜你喜欢
  • 2021-11-24
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多