输入:
a;3;c;1
a;4;b;2
a;5;c;1
输出:
a;3;c;1
a;5;c;1
因此,应打印所有具有第1,3和4列重复的行。
答案 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
当然只有具有特定列的行是第一行时才有效。