我有如下映射文件:
新建\u主_映射.txt
{1=[343, 0, 686, 1372, 882, 196], 2=[687, 1, 1373, 883, 197, 736, 1030, 1569], 3=[1374, 2, 884, 737, 198, 1570]}
新建_映射.txt
{1=[1152, 816, 1488, 336, 1008], 2=[1153, 0, 817, 337, 1489, 1009, 1297], 3=[1, 1154, 1490, 338]}
在上面的映射文件中,每个clientId
都有新的主映射和新的次映射。例如:clientId 1
具有343, 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's
的旧映射。你知道吗
旧\u小学_映射.txt
{1=[686, 1372, 882, 196], 2=[883, 197, 736, 1030, 1569], 3=[1374, 2, 884, 737]}
旧的_映射.txt
{1=[1488, 336, 1008], 2=[817, 337, 1489, 1009, 1297], 3=[1490, 338]}
问题陈述
现在,我需要读取所有四个文件,对于每个clientId
,我需要找出新映射和旧映射之间的不常见之处(意思不同)。你知道吗
例如:clientId 1
具有343, 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)
注:只要数字是相同的,那就是匹配。数字的顺序无关紧要。因此,我需要找到那些不是每个客户的共同数字。你知道吗
这是我删除文件的方法,但当我运行它时,它会给我错误:
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
脚本:用法(输入文件的顺序很重要,但也可以重新安排方法,直接在脚本中按名称访问文件):
输出:
标准命令
使用标准unix命令sort和comm的简短解决方案
comm
获取两个文件(必须按字典顺序排序),并使用分隔符<tab>
生成具有3列的输出选项
-1
-2
-3
正在删除相应的列,因此-23
只保留在第一列中。你知道吗如果必须经常调用此操作,则启动多个进程可能会很长,在这种情况下,只能使用bash内置函数和函数执行此操作:
重击4
相关问题 更多 >
编程相关推荐