比较两个csv文件是否相同
- Shell命令以及注意细节
- 项目展示
Shell命令以及注意细节
shell命令很多,只能跟着demo,用到了什么解析什么
先熟悉一下shell命令,这次demo中用到的
- 创建一个CompareDemo文件夹
mkdir CompareDemo
- 创建一个compare.sh文件,并且直接进行编辑
vim compare.sh
- 仅仅创建一个compare1.sh,不进行编辑模式
touch compare1.sh
mkdir.sh:创建文件夹
#!/bin/sh
fileName=$1
dirAndName=$fileName
if [ ! -d "$dirAndName" ];then
mkdir $dirAndName
echo "创建文件夹成功"
else
echo "文件夹已经存在"
fi
- 代码解析
#$1 表示传入的第一个参数, $2表示传入的第二个参数,如果传入的参数是两位数以上的,需要修改为 ${10}
变量赋值时,需要使用$符号前缀
‘-d’表示文件夹是否存在
‘-f’表示文件是否存在
- 执行.sh文件
sh mkdir.sh mkdirNameFile
bash mkdir.sh mkdirNameFile
添加 -x(执行)权限
chmod +x mkdir.sh
./ mkdir.sh
表示对当前目录下的mkdir.sh文件的所有者增加可执行权限
chmod u+x mkdir.sh
+表示增加权限;-表示取消权限;=表示取消之前的权限,并给予唯一的权限。
r表示Read,即读文件;w表示Write,即写文件;x表示运行文件。
- 对于.sh文件进行操作
u撤销 ctrl+r 取消之前的撤销
/dev/null可以理解为linux的黑洞,不要的结果都可以给里面丢
$ expr 1 + 7 &>/dev/null; echo $? 只返回处理是否正确
echo $? 判断上一条命令是否执行成功
只有成功才会返回0
赋值变量=前后不能有空格
例:a=1
- 文件排序
csv文件排序
通过逗号区分
先排序第二行
在排序第三行
$ sort -t"," -k2 -nk3 abcd.csv
放到临时文件
$ sort -t"," -k2 -nk3 SampleCsv3.csv > tmp.csv
- 对数组进行crud
#!/bin/bash
nums=(29 100 13)
# nums[*]和nums[@]获取数组中所有的元素
# #nums[@]获取数组中的个数
echo ${#nums[*]} #3
echo ${nums[*]} #29 100 13
#向数组中添加元素
nums[10]="HH"
echo ${#nums[@]} #4
echo ${nums[@]} #29 100 13 HH
echo ${#nums[10]} #2
echo ${nums[10]} #HH
#删除数组元素
unset nums[1]
echo ${#nums[*]} #3
echo ${nums[*]} #29 13 HH
- 获取csv的列
#打印第一行有多少列
awk -F "," 'NR==1{print NF}' tbc.csv
#打印最后一行有多少列
$ awk -F "," 'END{print NF}' tbc.csv
#查看第四行所有内容
$ awk 'NR==4' tbc.csv
#查看每行数据有多少列
$ awk -F "," '{print NF}' tbc.csv
#打印最后一列
$ awk -F "," '{print $NF}' tbc.csv
#查看有多少行
awk -F "," '{print NR}' tbc.csv
- 移动文件
将a.txt移动到deng文件夹里面
mv a.txt deng/
将b.txt c.txt移动到deng文件夹里面
mv b.txt c.txt -t deng/
- vim打开脚本时出现e325:attention
1、在存放文件的目录下面,通过ls -al 命令查看隐藏的文件
2、然后通过rm -f 删除以swp结尾的隐藏文件,
- 逻辑与预算
if [[ 'deng' == 'deng' && 201 == 201 ]];then
echo "进入if"
else
echo "进入else"
fi
# -a表示&& -o表示|| 注意空格的使用
if [ 'deng' == 'deng' -a 201 -eq 201 ];then
echo "AAAsuccess"
else
echo "AAAfail"
fi
- 判断数值是否是整数
if expr $3 + 1 &>/dev/null
then
echo 是数字
else
echo 不是数字
fi
#===================================
if [ $3 -gt 0 ] 2>/dev/null
then
echo "是数字!"
else
echo "不是数字!"
fi
#===================================
expr $3 + 0 &> /dev/null
if [ $? -ne 0 ];then
echo 第三个参数不是整数。
exit 1
fi
demo需求:
执行下面的命令获取,根据第四个参数对csv进行升序排序,将比较结果存为临时文件。比较两个临时文件,如果文件相同则删除临时文件,如果文件不同,则保留临时文件
$ sh csvcheck.sh StartSampleCsv1.csv StartSampleCsv2.csv 3 2,5,9
$ echo $?
0
#命令解析
sh csvcheck.sh 执行csvcheck.sh文件
StartSampleCsv1.csv 第一个参数 csv文件
StartSampleCsv2.csv 第二个参数 csv文件
3 第三个参数 表示需要排序多少列
2,5,9 第四个参数 表示根据那几列进行排序
代码
#!/bin/sh
#转换为数组
function to_array()
{
x=$1
OLD_IFS="$IFS"
IFS=","
array=($x)
IFS="$OLD_IFS"
for each in ${array[*]}
do
echo $each
done
}
#定义日志文件名称
logTxt=log.txt
#取现在的时间
timeLogFile=$(date +"%Y/%m/%d %H:%M:%S")
timeFile=$(date +"%Y%m%d_%H%M%S")
#csv名取得
firstFile=$1
SecondFile=$2
#判断日志文件是否存在,不存在则创建日志文件
if [ ! -f $logTxt ];then
touch $logTxt
fi
#入力参数至少是4个
if [ ! $# -ge 4 ];then
#打印日志到log.txt文件
echo [$timeLogFile] 入力参数至少是4个 >> $logTxt
exit 1
fi
#获取传入文件的后缀
firstFileSuffix=${firstFile##*.}
SecondFileSuffix=${SecondFile##*.}
#判断文件后缀是否是csv结尾
if [ ${firstFileSuffix} != 'csv' ];then
echo [$timeLogFile] 文件格式不正确。 >> $logTxt
exit 1
else
if [ ${SecondFileSuffix} != 'csv' ];then
echo [$timeLogFile] 文件格式不正确。 >> $logTxt
exit 1
fi
fi
#第3个参数是否是整数
#判断整数:和0相加,是否可以正常执行,如果可以正常执行则为整数
#[ $? -ne 0 ]判断上面的执行结果是否正确。
#if 判断添加 []两边必须保留空格
expr $3 + 0 &> /dev/null
if [ $? -ne 0 ];then
echo [$timeLogFile] 入力参数不正确。 >> $logTxt
exit 1
fi
#第一个csv文件是否存在
if [ -f $firstFile ];then
#第一个csv文件内容是否为空
if [ ! -s $firstFile ];then
echo [$timeLogFile] $firstFile内容为空。 >> $logTxt
exit 1
fi
else
echo [$timeLogFile] $firstFile文件不存在。 >> $logTxt
exit 1
fi
#第二个csv文件是否存在
if [ -f $SecondFile ];then
#第二个csv文件内容是否为空
if [ ! -s $SecondFile ];then
echo [$timeLogFile] $SecondFile内容为空。 >> $logTxt
exit 1
fi
else
echo [$timeLogFile] $SecondFile文件不存在。 >> $logTxt
exit 1
fi
#csv列数取得
firstFileColumn=`awk -F ',' 'NR==1{print NF}' ${firstFile}`
SecondFileColumn=`awk -F ',' 'NR==1{print NF}' ${SecondFile}`
#将第四个参数转换为数组
arr=($(to_array $4))
arrayLength=${#arr[*]}
#获取当前路径
tmpPath=$(cd $(dirname $0);pwd)
#第三个参数和第四个参数的长度是否相等
if [ $3 -eq $arrayLength ];then
#定义排序的列
login2=""
for((i=0;i<${arrayLength};i++));do
#第4个参数中存在大于csv列的值
expr ${arr[$i]} + 0 &> /dev/null
if [ $? -eq 0 ];then
if [ ${arr[$i]} -gt $firstFileColumn ];then
echo [$timeLogFile] 输入的参数不正确。>>$logTxt
exit 1;
fi
login2="${login2} -k${arr[i]}"
else
echo ${arr[$i]}
echo "第四个参数的数字不正确"
exit 1
fi
done
#创建临时文件夹
dir="${tmpPath}/${timeFile}"
if [ ! -d "$dir" ];then
mkdir $dir
fi
#对csv进行排序并且创建临时文件
sort -t"," -n ${login2} $1 > $dir/${firstFile%.*}_temporaryFile.csv
sort -t"," -n ${login2} $2 > $dir/${SecondFile%.*}_temporaryFile.csv
#判断临时文件是否相同
diff -q $dir/${firstFile%.*}_temporaryFile.csv $dir/${SecondFile%.*}_temporaryFile.csv
if [ $? == 0 ];then
#如果相同删除临时文件
rm -rf $timeFile
#rm $dir/${firstFile%.*}_temporaryFile.csv
#rm $dir/${SecondFile%.*}_temporaryFile.csv
else
exit "1"
fi
#第三个参数和第四个参数的长度不相等
else
echo [$timeLogFile] 项目参数3和项目参数4输入的内容长度不一致 >> $logTxt
exit "1"
fi