AWK - 仅打印重复项

时间:2012-05-07 15:59:19

标签: awk getline

我有一个文件:

jeden
dwa
jeden
trzy
trzy
cztery
piec
jeden

此命令打印出来:

$ awk 'BEGIN {while ((getline < "file") > 0) if(a[$0]++) print }'
jeden
trzy
jeden

我想打印所有副本:

jeden
jeden
trzy
trzy
jeden

编辑:

我找到了一个有效的例子。

awk '{if (x[$1]) { x_count[$1]++; print $0; if (x_count[$1] == 1) { print x[$1] } } x[$1] = $0}' file

我想做同样的事情,但是使用getline。

3 个答案:

答案 0 :(得分:3)

awk 'BEGIN {while ((getline < "file") > 0) { a[$0]++; if(a[$0] == 2) print; if (a[$0] >= 2) print }}'

当计数为2时,它会打印该行。当计数大于或等于2时,它会打印该行。因此,对于第二次出现,该行打印两次以“赶上”。

答案 1 :(得分:1)

您需要将所有行存储在内存中或者再次通过该文件。做第一个可能更容易,除非它是一个大文件,你可能有它的记忆。当然,你可以将它填充到一行,但为了便于理解,这里它是一个文件。

#!/usr/bin/awk -f

{ 
        lines[NR] = $0
        counts[$0]++ 
}             

END { 
        for(i = 0; i < length(lines); i++) {
                if(counts[lines[i]] > 1) {
                        print lines[i]
                }       
        }       
}

此外,您的原文将更加简明扼要地写成:

$ awk 'a[$0]++' file

答案 2 :(得分:0)

这可能对您有用:

awk '{a[$1]++}END{for(x in a)if(a[x]>1)for(i=1;i<=a[x];i++)print x}' file