热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

案例1-合并2个不同文件夹中的csv文件到另外一个目录,相同的文件名进行数据合并,不同的文件名直接移到新文件夹

发现在ubuntu和centos中有些命令还不一样,比如<<<可在centos中使用,但是ubuntu中不行csv文件名以及格式如下3669_20180121.csv

发现在ubuntu和centos中有些命令还不一样,比如<<<可在centos中使用,但是ubuntu中不行

 

 csv文件名以及格式如下

3669_20180121.csv

总笔数,2,总金额,21
2018011116200603729,2018011159999248,201700198,2018/01/11 00:00,1.00,一卡通充值,120
2018011116223903730,2018011159999789,201700198,2018/01/11 00:00,2.00,一卡通充值,120

 需求:

1)如果文件名相同,则把总笔数数值以及总金额数值相加,把除一行外的其他行进行追加。

2)对于文件名不通的文件,则直接放在新文件夹中。

3)新文件夹只保存最近的30个文件

 

方法1,可在ubuntu和centos中使用

#!/bin/bash

filenum=30
dir1=./upload_root/gdby
dir2=./upload_root/bzbygz
dir_merge=./download

#删除旧文件
rm -f $dir_merge/*.csv


dir1_select=`ls $dir1 | sort -r | head -$filenum`
dir2_select=`ls $dir2 | sort -r | head -$filenum`


#2个文件夹共有的
echo "两个学校共有的文件名"

for i in ${dir1_select}
do
    for file2 in ${dir2_select}
    do
        if [ "$i" = "$file2" ];then
        echo $i
        num1=$(head -1 $dir1/$i | awk -F "," '{print $2}')
        num2=$(head -1 $dir2/$i | awk -F "," '{print $2}')
        money1=$(head -1 $dir1/$i | awk -F "," '{print $4}')
        money2=$(head -1 $dir2/$i | awk -F "," '{print $4}')


        num_all=$((num1+num2))
        money_all=$(echo $money1 $money2 | awk '{print $1+$2}')

        cp $dir1/$i $dir_merge
        sed -ie "1 s#`echo $num1`#`echo $num_all`#; 1 s#`echo $money1`#`echo $money_all`#" $dir_merge/$i
        #sed '1d' $dir2/$i >> $dir_merge/$i
        tail -n +2 $dir2/$i >> $dir_merge/$i

        fi
    done
done



rm -f $dir_merge/*.csve


#只在$dir1中有的:
echo "只在gdby中存在的文件"
for i in ${dir1_select}
do
  for file2 in ${dir2_select}
  do
    if [ "$i" != "$file2" ];then
    cp $dir1/$i $dir_merge
    fi
  done
done
#grep -q $i <<<${dir2_select};if [[ $? -ne 0 ]];then cp $dir1/$i $dir_merge;fi;done


#只在$dir2中有的:
echo "只在bzbygz存在的文件"
for i in ${dir2_select}
do
  for file1 in ${dir1_select}
  do
    if [ "$i" != "$file1" ];then
    cp $dir2/$i $dir_merge
    fi
  done
done

 

 

方法2,只能在centos中使用

#!/bin/bash

filenum=30
dir1=./test1
dir2=./test2
dir_merge=./test3

#删除旧文件
rm -f $dir_merge/*.csv


dir1_select=`ls $dir1 | sort -r | head -$filenum`
dir2_select=`ls $dir2 | sort -r | head -$filenum`


#2个文件夹共有的
for i in ${dir1_select}
do grep -q $i <<<${dir2_select} #<<<只能在centos中使用, grep -q安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
    if [[ $? -eq 0 ]];then
        echo $i
        num1=$(head -1 $dir1/$i | awk -F "," '{print $2}')
        num2=$(head -1 $dir2/$i | awk -F "," '{print $2}')
        money1=$(head -1 $dir1/$i | awk -F "," '{print $4}')
        money2=$(head -1 $dir2/$i | awk -F "," '{print $4}')


        num_all=$(($num1+$num2))
        money_all=$(echo $money1 $money2 | awk '{print $1+$2}')

        cp $dir1/$i $dir_merge
        sed -ie "1 s#`echo $num1`#`echo $num_all`#; 1 s#`echo $money1`#`echo $money_all`#" $dir_merge/$i
        #sed '1d' $dir2/$i >> $dir_merge/$i
        tail -n +2 $dir2/$i >> $dir_merge/$i
    fi
done

rm -f $dir_merge/*.csve


#只在$dir1中有的:
for i in ${dir1_select};do grep -q $i <<<${dir2_select};if [[ $? -ne 0 ]];then cp $dir1/$i $dir_merge;fi;done

#只在$dir2中有的:
for i in ${dir2_select};do grep -q $i <<<${dir1_select};if [[ $? -ne 0 ]];then cp $dir2/$i $dir_merge;fi;done

 

 

三. 执行定时任务时不执行

解决方法,crontab -e中这样写,并添加脚本的执行权限。
SHELL=/bin/bash
0 3 * * * cd /data/sftp/mysftp/ && ./file_merge.sh


推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • Java程序员必会的40个Linux命令!
    你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起 ... [详细]
  • 湍流|低频_youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了youcans的OpenCV例程200篇106.退化图像的逆滤波相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
author-avatar
休息一下狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有