shell脚本 比较两个csv文件是否相同,Demo总结

比较两个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值