我正在尝试发出一个unix命令,否则可以使用一个小的脚本。
我有一个100列的大型.csv。每行中的数据可能具有重复的列2,但其余的可能有所不同。
我需要找到第2列的所有重复项,然后如果第84列不匹配,则输出该列。
我的数据是所有客户信息,因此我无法发布实际数据,但是类似这样。
m,123abc,john,info,info,info,1232
m,456jie,doe,info,info,info,98743
m,456jie,doe,info,info,info,98743
m,123abc,john,info,info,info,12343
m,948eio,will,info,info,info,info
m,123abc,john,info,info,info,12343
期望的输出:
m,123abc,john,info,info,info,1232
m,123abc,john,info,info,info,12343
m,123abc,john,info,info,info,12343
我希望将此作为我的输出,因为第2列相同,所以重复。然后第7列不相同。我不想在输出中使用456jie,因为第7列对这两行都匹配。
我的数据总是会有所不同,因此我无法具体说明第7列。但是我要查找的是第2列的倍数,其中第7列不匹配。
目前,我有一个简单的awk脚本。
#!/usr/bin/awk -f
{
lines[$1][NR] = $0;
}
END {
for (vehid in lines) {
if (length(lines[vehid]) > 1) {
for (lineno in lines[vehid]) {
print lines[vehid][lineno];
}
}
}
}
这将使我得到第2列中重复的所有内容。我还需要它也比较第84列(或上面示例中的第7列),如果它们确实匹配,则将它们从我的输出中删除,只输出第2列的行匹配,而列84不匹配。如果第2列匹配,而第84列确实匹配,则我不需要查看它。
这里有两种方法
表面上,#2是可能的,但事实证明,这比预期的要困难。以下是我的尝试(使用$ 2,$ 7),
awk -F, -v 'OFS=,' '
{
# Ignore rows with identical key
m[$2, $7]++
if ( m[$2, $7] > 1 && k[$2] == 1) next ;
k[$2]++
if ( k[$2] == 1 ) {
# Save first distinct value for $2
p[$2] = $0 ;
} else if ( k[$2] == 2 ) {
print p[$2]
# print "P " FNR, p[$2]
}
print $0
# print "N " FNR, $0
}
' < input-file
回想起来,采用其他方法可能会更好: