
kafka接数程序存在数据丢失的问题,且A、B文件数据乱序,需要编写一个脚本来输出丢失的元数据并生成脚本C。且属于样例抽测,量级不大。
其它基本的语法整合:Shell_字符串操作(sed命令操作文本和数字自增方式)
A(全量)文件数据:
zhangsan,1001,男,浙江杭州 lisi,1004,男,湖北武汉 wangwu,1003,女,湖南长沙
B(存在缺失)文件数据:
USER_INFO|lisi|1004|男|湖北武汉
C(漏掉的)文件数据:
zhangsan,1001,男,浙江杭州 wangwu,1003,女,湖南长沙
因为AB文件乱序,不可优化。采用双层遍历文件AB的每行数据,尽可能减少时间复杂度:1、外层循环为B;2、采用全量数据删除存在数据的方式降低次数;
$变量名外面的花括号是可选的,加不加都行.
Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:
``:表示执行对应的命令
variable=`command` variable=$(command)
echo '$name"'
双引号是不会屏蔽对变量和某些特殊符号的转义的,而单引号里的所有内容都会原封不动的输出,而单引号里再用单引号将变量引起来,变量就又可以正常的显示,有点像数学里的负负为正。
四种方法:
expr 1 + 2
原来这个命令要在加号两边加上空格。
$(())
( ( (( ((num1-$num2))
$[]
$[num1 * num2]
let
let sum= n u m 1 − num1- num1−num2;echo $sum
if [ ${destArray[2]} = ${outArray[1]} ];
空格,判断不能丢,shell对空格的要求是很高的。
根据A、B生成目标文本C:
sh test.sh /realtime/cbry/awkTest/A.txt , /realtime/cbry/awkTest/B.txt , /realtime/cbry/awkTest/C.txt
脚本中下面命令的分隔符 “,” 和 “,”,实际没有用到,但是入参占位对应,需要修改。脚本实现目标功能,但是未经过仔细雕琢,需要细化修改可能更好理解。
#!/bin/bash
#write By liaoxg
#入参分隔符可以不需要,但是要调整参数位置
# sh test.sh /realtime/cbry/awkTest/A.txt , /realtime/cbry/awkTest/B.txt , /realtime/cbry/awkTest/C.txt
echo "入参:Source: ${1} , 分隔符:${2} "
echo " 比较文件:${3} ,分隔符:${4}"
echo "输出文件:${5}"
#
fileDirPath=`pwd`'/'
echo "当前执行路径:$fileDirPath"
#
src=$1
srcSplitor=$2
dest=$3
destSplitor=$4
outFile=$5
echo $src
echo $dest
#
`cp ${src} ${outFile}`
#
outIndex=0;
destIndex=0;
while read destLine
do
destIndex=$((destIndex+1));
echo "遍历SRC $destLine"
while read outLine
do
outIndex=$((outIndex+1));
destArray=(${destLine//|/ });
#echo "destArray:"${destArray[2]}
outArray=(${outLine//,/ })
#echo "outArray:"${outArray[1]}
if [ ${destArray[2]} = ${outArray[1]} ];
then
#echo "${destArray[2]} == ${outArray[1]}"
echo "删除outFile${outIndex}行:${outLine}"
#echo ",,,比较:dest 第${destIndex} : ${destLine}"
`sed -i ''${outIndex}'d' ${outFile}`;
outIndex=0;
break;
else
echo "跳过"${destArray[2]} "__" ${outArray[1]}
continue
fi
done < ${outFile}
done < ${dest}
使用awk进行分隔:
awk -F"," '{print $1}' A.txt