- 论坛徽章:
- 0
|
8可用积分
·奉上我的所有的可用积分,如果接收赊账的话,50日后给
·需求: 正常情况下三个服务器的“特征码”不会有重复,但是当出错的时候,可能特征数据会出现在两个服务器上。
特征码据分4段,
每个服务器有用的行数据如下
H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
我们可以找到四个 H'001E28:开头的行,然后列块合并就得到了我们要的特征码, 如第一个块 84588888777766FF
H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
H'001E28:......)H'8888:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
H'001E28:......)H'7777:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
H'001E28:......)H'66FF:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
一个服务器上理论数据不重复,所以我用了uniq对每个服务器数据处理,这样也排除了非法数据00000000000FFFF的占比
所以需求:
1, 优化下面效率,给出来的东西希望有注解,我是新手
2, 比较高的效率算出三个服务器之间的三角重叠关系,以及三个服务器都出现了一个特征码的情况,我下面代码没有考虑的这个状况
- #!/usr/bin/bash
- ###删除无关文件清屏
- echo -e "\e[2J\e[1;1H"
- rm -f full.log
- rm -f uniq.log
- rm -f *list
- rm -f orig
- rm -f cut*
- rm -f merge
- rm -f server
- ###开始处理文件,文件通常3个,单个文件中有效数据为300000行,有效数据格式如下,为72 (72*2字节), 为8个特征码的1/4部分数据
- ###H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
- ### 少量异常的行会出现两行出现在一行,需要在73字节处做换行,让多出来的部分变成下一行
- for varfile in *.log
- do
- ###处理文件为300000 * 72 的有效文件
- cat $varfile | egrep "\.{6}" | sed 's/^.{72}/&\n/' | sed '/^$/d' > orig
- ###判断文件有效性
- file_length=$(cat orig |wc -l)
- if [ "$file_length" != 300000 ]; then
- echo "$varfile is corrupted, get a new one or contact Koomier"
- echo -e "byebye, I am free now and you got work to do\a"
- exit 0
- else
- echo "$varfile: $file_length line"
- echo "Kimi is fighting..."
- echo "..."
- ###分割文件, 将文件按行切割成 75000 * 72的四个有效文件,然后粘贴按列文件75000 * (72*4)的文件
- sed -n '1,75000p' orig | sed 's/\r\n/\n/' > cut1
- sed -n '75001,150000p' orig | sed 's/\r\n/\n/' > cut2
- sed -n '150001,225000p' orig | sed 's/\r\n/\n/' > cut3
- sed -n '225001,300000p' orig | sed 's/\r\n/\n/' > cut4
- paste -d "" cut1 cut2 cut3 cut4 > merge
- ###对文件切割,一个特征码由第一个四位数字(如H'8458)以及他相隔72*i (i=1,2,3)组成一个特征码, 一行共含有 8 * 8 个特征码, 对得到的所有特征码去重
- cat merge |cut -b 19-22,91-94,163-166,235-238 > server
- cat merge |cut -b 26-29,98-101,170-173,242-245 >> server
- cat merge |cut -b 33-36,105-108,177-180,249-252 >>server
- cat merge |cut -b 40-43,112-115,184-187,256-259 >>server
- cat merge |cut -b 47-50,119-122,191-194,263-266 >>server
- cat merge |cut -b 54-57,126-129,198-201,270-273 >>server
- cat merge |cut -b 61-64,133-136,205-208,277-280 >>server
- cat merge |cut -b 68-71,140-143,212-215,284-287 >>server
- cat server | sort | uniq > ${varfile}_list
- rm orig
- rm cut*
- rm merge
- rm server
- fi
- done
- echo -e "End.."
- ###将三个文件处理得到的特征码放到一个总表中,排序, 去重,从而得到总特征码数量,以及真实数量,和重复数量
- cat *list | sort | tee full.log | uniq > uniq.log
- full_length=$(cat full.log |wc -l)
- echo "Sum of phone numbers: $full_length"
- uniq_length=$(cat uniq.log |wc -l)
- echo "Acutal Users: $uniq_length"
- declare -i gap = $full_length-$uniq_length
- echo "Delta: $gap"
复制代码 |
|