栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

Shell

Java 更新时间:发布时间: 百科书网 趣学号
前言

​ 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语法注意事项 变量的定义

$变量名外面的花括号是可选的,加不加都行.


shell返回结果

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

``:表示执行对应的命令

variable=`command`
variable=$(command)

原样输出字符串,不进行转义或取变量(用单引号)
echo '$name"'

双引号是不会屏蔽对变量和某些特殊符号的转义的,而单引号里的所有内容都会原封不动的输出,而单引号里再用单引号将变量引起来,变量就又可以正常的显示,有点像数学里的负负为正。


shell 中做加减法

四种方法:

expr 1 + 2

原来这个命令要在加号两边加上空格。

$(())

( ( (( ((num1-$num2))

$[]

$[num1 * num2]

let

let sum= n u m 1 − num1- num1−num2;echo $sum


if判断字符串相等
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进行分隔:

awk -F"," '{print $1}' A.txt
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号