【问题标题】:AWK - print only duplicatesAWK - 仅打印重复项
【发布时间】:2012-05-16 03:31:57
【问题描述】:

我有一个文件:

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。

【问题讨论】:

  • 另一个:sort file | uniq -D
  • 为什么要使用getline?
  • @Kevin 因为我会在脚本中用到它。

标签: awk getline


【解决方案1】:
awk 'BEGIN {while ((getline < "file") > 0) { a[$0]++; if(a[$0] == 2) print; if (a[$0] >= 2) print }}'

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

【讨论】:

  • @Tedee12345:请注意,这可能会稍微影响排序。
  • @Dennis Williamson 你能举一个这个主题的例子吗?
  • @Tedee12345:例如,如果您有 a、b、b、a,则 b 将在 a 之前打印。然而,这可能不是不可取的。
  • @Dennis Williamson 现在我明白了。谢谢你的澄清。
【解决方案2】:

您需要将所有行存储在内存中,或者对文件进行第二次遍历。做第一个可能更容易,除非它是一个巨大的文件,否则你可能有它的内存。当然,您可以将其塞入一行,但为了便于理解,这里将其作为一个文件。

#!/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

【讨论】:

    【解决方案3】:

    这可能对你有用:

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

    【讨论】:

    • 看起来他想按顺序排列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2018-07-02
    • 1970-01-01
    • 2017-12-23
    • 2021-11-04
    相关资源
    最近更新 更多