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

时间:2014-10-08 14:50:11

标签: awk grep

我希望看到第2列中的哪个字符串重复。

例如:

a   apple
b   peach
c   grape
d   peach
e   peach
f   apple

我的输出是:

a   apple
f   apple
b   peach
d   peach
e   peach

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

3 个答案:

答案 0 :(得分:3)

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

$ awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file
a   apple
b   peach
d   peach
e   peach
f   apple
  • 首先计算列值出现的次数
  • 其次打印第二列至少计数两次的行。

作为Jonathan Leffler suggests,要重现您获得的确切输出,只需输入sort,表示它应首先按第2列排序,然后按第1列排序:

awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file | sort -k2,2 -k1

答案 1 :(得分:0)

没有两次读取文件的perl解决方案:

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

这会遍历文件,并将每一行保留在哈希中,该哈希的键是第2个字段,其值是行列表。然后,最后,它将打印不止一次看到其键的列表。

答案 2 :(得分:0)

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

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