打印重复条目而不删除unix / linux

时间:2015-10-12 09:13:41

标签: unix awk

我们说我有一个这样的文件有2列

    56-cde
    67-cde
    56-cao
    67-cgh
    78-xyz
    456-hhh
    456-jjjj
    45678-nnmn
    45677-abdc
    45678-aief

我想获得这样的输出:

    56-cde
    56-cao
    67-cde
    67-cgh
    456-hhh
    456-jjjj
    45678-aief
    45678-nnmn

所以基本上不是打印出打印重复项所需的唯一值:

我试图用这样的awk来完成这个:

    cat input.txt | awk -F"-" '{print $1,$2}' | sort -n | uniq -w 2 -D

毫无疑问,这表明我已经复制了第1列中的哪些值,并且还显示了第1列的重复值以及相应的第2列值。但由于我将字节数硬编码为2,因此它仅显示第一列中2位数字的重复值。有没有办法用awk做到这一点?

提前致谢。

5 个答案:

答案 0 :(得分:1)

查看您的uniq是否有-D选项。我的cygwin版本确实:

cat input.txt | sort | uniq -w 2 -D

答案 1 :(得分:1)

另一个没有数组的awk解决方案(但使用预分配)

 sort -n file | awk -F- '
       NR==1{p=$1; a=$0; c++; next} 
       p==$1{a=a RS $0; c++; next} 
           c{print a} 
            {a=$0; p=$1; c=0} 
         END{if(c) print a}'

答案 2 :(得分:0)

这就是我提出的(只是一个awk程序,没有外部排序,uniq等):

BEGIN { FS = "-" }

{ arr[$1] = arr[$1] "-" $2  }

END { 
    for (i in arr) {
        if ((n = split(arr[i], a)) < 3) continue
        for (j = 2; j <= n; ++j)
            print i"-"a[j]
    }
}

它会收集所有数字以及附加的不同字符串 在arr中(假设字符串不会包含短划线-)。

使用gawk,你可以使用数组数组,以避免连接和破折号分裂。

答案 3 :(得分:0)

我会通过预处理数据来处理变数位数的情况,这样数字字段 是一个固定的大宽度(并在uniq中使用该宽度):

cat input.txt | awk -F- '{printf "%12d-%s\n",$1,$2}'| sort | uniq -w 12 -D

如果您还需要输出左对齐,只需处理此后处理步骤:

| awk '{print $1}'

答案 4 :(得分:0)

使用Perl

$ cat two_cols.txt
56-cde
67-cde
56-cao
67-cgh
78-xyz
456-hhh
456-jjjj
45678-nnmn
45677-abdc
45678-aief

$ perl -F"-" -lane ' @t=@{$kv{$F[0]}}; push(@t,$_); $kv{$F[0]}=[@t]; END { while(($x,$y)=each(%kv)){ print join("\n",@{$y}) if scalar @{$y}>1 }} ' two_cols.txt
67-cde
67-cgh
56-cde
56-cao
456-hhh
456-jjjj
45678-nnmn
45678-aief

$