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

Using awk how do I print all lines containing duplicates of specific columns?

输入:

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

输出:

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

因此,所有与第 1,3 和 4 列重复的行都应该被打印出来。

试试这个单线:

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

它遍历文件两次,第一次,它标记了应该打印的行号,第二次打印这些行。

这是我的解决方案:

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

输出:

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

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

如果 2 遍方法可行:

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

否则:

$ awk -F';' '
    { key= FS  FS ; a[key,++cnt[key]]=[=11=] }
    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 运算符,第二个脚本中键的输出顺序将是随机的 - 如果这是一个问题,很容易修复。