在第二列中查找重复项,但第84列不匹配

问题描述 投票:-2回答:1

我正在尝试发出一个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列确实匹配,则我不需要查看它。

csv unix awk uniq
1个回答
0
投票

这里有两种方法

  • 将所有数据加载到内存中,然后处理数组,或
  • 尝试一次处理所有数据,使用数组保持各种键组合的状态

表面上,#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

回想起来,采用其他方法可能会更好:

  • 将所有数据加载到内存中,并计数不同的$ 2和[$ 2,$ 7]的值
  • 在有多个[$ 2,$ 7]的地方寻找$ 2键。
  • 打印与选定的$ 2键相关的所有数据。
© www.soinside.com 2019 - 2024. All rights reserved.