首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查某一列中的哪个字符串重复

检查某一列中的哪个字符串重复
EN

Stack Overflow用户
提问于 2014-10-08 22:50:11
回答 3查看 41关注 0票数 1

我想看看我的第二列中的哪个字符串是重复的。

例如:

代码语言:javascript
复制
a   apple
b   peach
c   grape
d   peach
e   peach
f   apple

我的输出将是:

代码语言:javascript
复制
a   apple
f   apple
b   peach
d   peach
e   peach

显示在第二列中具有公共字符串的整行。

EN

回答 3

Stack Overflow用户

发布于 2014-10-08 22:54:04

如果您不想将所有文件都存储在内存中,最好的方法是读取该文件两次。

代码语言:javascript
复制
$ awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file
a   apple
b   peach
d   peach
e   peach
f   apple

  • 首先计算列值appears
  • secondly的多少次,以打印其中第二列至少计数两次的行。

作为Jonathan Leffler suggests,要再现您得到的确切输出,只需通过管道连接到sort,指示它应该首先按第2列排序,然后按第1列排序:

代码语言:javascript
复制
awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file | sort -k2,2 -k1
票数 3
EN

Stack Overflow用户

发布于 2014-10-08 23:40:40

一个不会两次读取文件的perl解决方案:

代码语言:javascript
复制
perl -lane 'push @{$s{$F[1]}},$_; 
            END{
                do{print join "\n", @{$s{$_}} if scalar(@{$s{$_}})>1}for(%s)
            }' file

这将遍历整个文件,并将每一行保存在一个散列中,散列的关键字是第2个字段,值是行列表。然后,在最后,它将打印其关键字多次出现的列表。

票数 0
EN

Stack Overflow用户

发布于 2014-10-09 00:26:37

使用GNU awk实现真正的2D数组:

代码语言:javascript
复制
gawk '
{ vals[$2][++cnt[$2]] = $0 }
END {
    for (fruit in vals)
        if (cnt[fruit] > 1)
            for (i=1; i<=cnt[fruit]; i++)
                print vals[fruit][i]
}
' file
a   apple
f   apple
b   peach
d   peach
e   peach
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26259931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档