Shell Unix脚本-在多个dat文件中查找重复字符串

Shell Unix脚本-在多个dat文件中查找重复字符串,shell,unix,duplicates,Shell,Unix,Duplicates,请帮助我提供以下逻辑的Unix脚本解决方案 合并多个分隔的.dat文件,并将合并的文件放在tmp位置 需要根据主键字段在合并文件中标识重复项。在一行中,可能需要考虑三到四个关键字段NEE。其他行中键字段的组合也被称为重复项。此特定逻辑需要以可编辑的方式进行,因为关键字段因文件而异 位置重复输出文件需要放置在tmp位置 例如: *原始文件数据(关键字段为ID、全名和年龄)* ID|source_code|Full_Name|AGE 123|01|John|20 190|05|Mary|35

请帮助我提供以下逻辑的Unix脚本解决方案

  • 合并多个分隔的.dat文件,并将合并的文件放在tmp位置
  • 需要根据主键字段在合并文件中标识重复项。在一行中,可能需要考虑三到四个关键字段NEE。其他行中键字段的组合也被称为重复项。此特定逻辑需要以可编辑的方式进行,因为关键字段因文件而异
  • 位置重复输出文件需要放置在tmp位置
  • 例如:

    *原始文件数据(关键字段为ID、全名和年龄)*

    ID|source_code|Full_Name|AGE
    
    123|01|John|20
    
    190|05|Mary|35
    
    123|05|John|20
    
    180|09|John|30
    
    190|100|Seam|20
    
    190|900|Jack|10
    
    预期输出文件


    将以下代码另存为
    dups.py
    ,然后运行
    python dups.py

    (这不是shell脚本。您需要
    python
    才能运行。)

    样本输出:

    $ cat test.dat 
    ID|source_code|Full_Name|AGE
    123|01|John|20
    190|05|Mary|35
    123|05|John|20
    180|09|John|30
    190|100|Seam|20
    190|900|Jack|10
    $ python dups.py < test.dat
    123|John|20;line no 1 & 3
    
    $cat test.dat
    ID |源代码|全名|年龄
    123 | 01 |约翰| 20
    190 | 05 |玛丽| 35
    123 | 05 |约翰| 20
    180 | 09 |约翰| 30
    190 | 100 |接缝| 20
    190 | 900 |杰克| 10
    $python dups.py
    尝试grep-c-n“123”原始文件>预期输出文件
    #!/usr/bin/env python
    
    import sys
    import collections
    
    d = collections.defaultdict(list)
    for lineno, line in enumerate(sys.stdin, start=0):
        row = line.strip().split('|')
        if len(row) == 4:
            key = '{0[0]}|{0[2]}|{0[3]}'.format(row)
            d[key].append(lineno)
    
    for line in d:
        linenos = d[line]
        if len(linenos) > 1:
            print('{};{} Occurances;line no {}'.format(
                line, len(linenos), ' & '.join(map(str, linenos)))
            )
    
    $ cat test.dat 
    ID|source_code|Full_Name|AGE
    123|01|John|20
    190|05|Mary|35
    123|05|John|20
    180|09|John|30
    190|100|Seam|20
    190|900|Jack|10
    $ python dups.py < test.dat
    123|John|20;line no 1 & 3