2

我有一个文件:

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。

4

3 回答 3

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

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

于 2012-05-08T00:00:21.423 回答
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
于 2012-05-07T16:27:37.157 回答
0

这可能对您有用:

awk '{a[$1]++}END{for(x in a)if(a[x]>1)for(i=1;i<=a[x];i++)print x}' file
于 2012-05-07T16:27:17.987 回答