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

时间:2013-06-19 10:24:10

标签: shell unix duplicates

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

  1. 合并muliple分隔的.dat文件并将合并文件放在tmp位置
  2. 需要根据主键字段在合并文件中标识重复项。在单行中,可以考虑三到四个关键字段。其他行中的关键字段的组合也称为重复字段。由于关键字段因文件而异,因此该特定逻辑需要采用可编辑的方式。
  3. 位置重复输出文件需要放在tmp位置
  4. 例如:

    * 原始文件数据(关键字段为ID,Full_Name&年龄)*

    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
    

    预期的输出文件

    123|John|20;2 Occurances;line no 1 & 3
    

1 个答案:

答案 0 :(得分:0)

将以下代码保存为dups.py,然后运行python dups.py < merged_file.dat

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

#!/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