使用awk如何打印包含特定列重复项的所有行?

时间:2017-04-28 08:42:15

标签: awk printing duplicates find multiple-columns

输入:

a;3;c;1
a;4;b;2
a;5;c;1

输出:

a;3;c;1
a;5;c;1

因此,应打印所有具有第1,3和4列重复的行。

3 个答案:

答案 0 :(得分:2)

如果2通过方法没问题:

$ awk -F';' '{key=$1 FS $3 FS $4} NR==FNR{cnt[key]++;next} cnt[key]>1' file file
a;3;c;1
a;5;c;1

否则:

$ awk -F';' '
    { key=$1 FS $3 FS $4; a[key,++cnt[key]]=$0 }
    END {
        for (key in cnt)
            if (cnt[key] > 1)
                for (i=1; i<=cnt[key]; i++)
                    print a[key,i]
    }
' file
a;3;c;1
a;5;c;1

由于in运算符,第二个脚本中键的输出顺序将是随机的 - 如果这是一个问题,则很容易修复。

答案 1 :(得分:1)

试试这个单行:

awk -F';' '{k=$1 FS $3 FS $4}
    NR==FNR{if(a[k]){p[a[k]];p[NR]}a[k]=NR;next}FNR in p' file file

它经过两次文件,第一次,它标记了应该打印的行号,第二次打印那些行。

答案 2 :(得分:-1)

这是我的解决方案:

awk 'BEGIN{ FS=";" }NR==1{ split($0, a, ";"); print }NR>1{ if ( a[1] == $1 && a[3] == $3 && a[4] == $4){ print }}'

输出:

a;3;c;1
a;5;c;1

当然只有具有特定列的行是第一行时才有效。