python - 找出每个 clientId 的新旧映射之间的差异

标签 python linux bash shell sed

我有如下所示的映射文件:

new_primary_mapping.txt

{1=[343, 0, 686, 1372, 882, 196], 2=[687, 1, 1373, 883, 197, 736, 1030, 1569], 3=[1374, 2, 884, 737, 198, 1570]}

new_secondary_mapping.txt

{1=[1152, 816, 1488, 336, 1008], 2=[1153, 0, 817, 337, 1489, 1009, 1297], 3=[1, 1154, 1490, 338]}

在上面的映射文件中,每个clientId都有新的primary和new secondary映射。例如:clientId 1343, 0, 686, 1372, 882, 196 新的主映射和 1152, 816, 1488, 336, 1008 新的二级映射。对于其他 clientIds 也是如此。下面是我的脚本,它为每个 clientId 打印数组:

#!/bin/bash
mapfiles=(new_primary_mapping.txt new_secondary_mapping.txt)

declare -a arr

mappingsByClientID () {
  id=$1 # 1 to 5 
  file=${mapfiles[$2]} # 0 to 1
  arr=($(sed -r "s/.*\b${id}=\[([^]\]+).*/\1/; s/,/ /g" $file))
  echo "${arr[@]}"
}

# assign output of function to an array
# and get mapping for clientId 3
pri=($(mappingsByClientID 3 0))
snd=($(mappingsByClientID 3 1))

# print whole array
echo "whole arr pri: ${pri[@]}"
echo "whole arr snd: ${snd[@]}"

现在我有两个其他文件,如下所示,它们具有相同 clientId 的旧映射

old_primary_mapping.txt

{1=[686, 1372, 882, 196], 2=[883, 197, 736, 1030, 1569], 3=[1374, 2, 884, 737]}

old_secondary_mapping.txt

{1=[1488, 336, 1008], 2=[817, 337, 1489, 1009, 1297], 3=[1490, 338]}

问题陈述

现在我需要读取所有四个文件,对于每个 clientId,我需要找出新旧映射之间不常见的地方(意思是区别)。

例如:clientId 1343, 0, 686, 1372, 882, 196 新的主映射和 1152, 816, 1488, 336, 1008 新的辅助映射。 此外,clientId 1 具有 686、1372、882、196 旧主映射和 1488、336、1008 旧辅助映射。

所以我将创建一个 pri 数组,其中包含以下条目:343 0 和 sec 数组,其中包含以下条目:1152 816。因为这些是每个clientId新旧映射的区别。我怎样才能在 shell 脚本中做到这一点?这可能吗?

此外,如果没有区别,则只需创建一个空数组并记录一条消息。

更新:

对于clientId 1,它应该打印:

pri=(343 0)
snd=(1152 816)

对于 clientId 2:

pri=(687 1 1373)
snd=(1153 0)

对于 clientId 3:

pri=(198 1570)
snd=(1 1154)

注意:只要数字相同就是匹配。数字的顺序无关紧要。所以我需要找到那些对每个 clientId 不常见的数字。

这是我删除文件的方式,但是当我运行它时,它给我错误:

for dir_name, numbers in (('primary', pri), ('secondary', snd)):
    for number in numbers:
        for filename in glob.glob('/{}/proc_{}_for_*.log'.format(dir_name, number)):
             os.unlink(filename)

这是我得到的错误:

NameError: name 'pri' is not defined

最佳答案

Python解决方案:

diff_mappings.py 脚本:

import sys, re, json

with open(sys.argv[1]) as old_primary, open(sys.argv[2]) as new_primary, \
    open(sys.argv[3]) as old_second, open(sys.argv[4]) as new_second:

    prepare_json = lambda f: json.loads(re.sub(r'([0-9]+)=', '"\\1":', f.read())) 
    old_pr_data = prepare_json(old_primary)
    new_pr_data = prepare_json(new_primary)
    old_snd_data = prepare_json(old_second)
    new_snd_data = prepare_json(new_second)

    for k in sorted(old_pr_data):
        print('ClientId ' + k)
        print('pri=({})'.format(' '.join(map(str, set(old_pr_data[k]) ^ set(new_pr_data[k])))))
        print('snd=({})\n'.format(' '.join(map(str, set(old_snd_data[k]) ^ set(new_snd_data[k])))))

用法(输入文件的顺序很重要,但也可以重新安排该方法以直接在脚本中按名称访问文件):

python diff_mappings.py old_primary_mapping.txt new_primary_mapping.txt old_secondary_mapping.txt new_secondary_mapping.txt

输出:

ClientId 1
pri=(0 343)
snd=(1152 816)

ClientId 2
pri=(1 687 1373)
snd=(0 1153)

ClientId 3
pri=(198 1570)
snd=(1 1154)

关于python - 找出每个 clientId 的新旧映射之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50127352/

相关文章:

python - PyCharm 代码折叠/大纲生成错误的边界

python - 实例变量和函数

linux - OCIEnvNlsCreate 错误。检查 ORACLE_HOME (Linux) env var 或 PATH (Windows) 和/或 NLS 设置、权限等

c - 如何从我的库中调用可执行文件中的函数?

linux - 如何更改文本文件中的文件内容

linux - 如果 bash 变量为 1 则运行否则不运行

bash - awk 获取下一行

python - argparse 选项的选项

Python Pandas 合并两个数据帧而不改变顺序

python - Linux 上用于 Python 和 Tkinter 的字体管理