awk,重复值

awk,重复值

我正在尝试编写一个脚本,以根据一组参数重复两次返回重复值。例如,在我的文本文件中,我有以下设置:

SPPARK|6543|M1122|6543|Hendrick|Brian|1977/11/09||
SPPARK|1245|M3344|6543|Hendrick|Brian|1977/11/09||

现在,如果姓氏、名字和出生日期重复,我也希望它返回这两行并继续,我知道awk可以做到这一点,但它似乎工作不正常。

awk '!seen[$4,$5]++ > 1' DemoDATA.txt

答案1

awk '!seen[$4, $5]++ > 1' DemoDATA.txt

几乎是正确的,除了文件中的字段由 分隔|,并且您应该查看姓氏和出生日期的字段是字段 5、6 和 7。您也不必进行比较与 1 (我可以理解你为什么这样做,但比较永远不会是真的)。

更正:

awk -F '|' '!seen[$5, $6, $7]++' DemoDATA.txt

然而,这只会输出重复项,而不是原始行。为此,您必须在解析文件时将整个文件保存在内存中......

...这就是“的答案”如何打印文件中某一列中具有重复值的所有行“正在做(或者不做,如果他们很聪明,其中一些人很聪明)。

答案2

正如 Kusalananda 建议的那样,将整个文件保存在内存中:

awk -F'|' '
    {
        key = $5 FS $6 FS $7
        count[key]++
        data[key] = data[key] (count[key] == 1 ? "" : ORS) $0
    }
    END { for (key in count) if (count[key] > 1) print data[key] }
' DemoDATA.txt

或者

perl -F'\|' -ane '
        $key = join "|", @F[4..6];
        push @{$data{$key}}, $_;
    } END {
        print @{$data{$_}} for grep {@{$data{$_}} > 1} keys %data;
' DemoDATA.txt

相关内容