linux文件合并,关键字去重复shell脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件合并,关键字去重复shell脚本相关的知识,希望对你有一定的参考价值。
两个文件 a.txt b.txt
a.txt :
123|bbb|ccc|ddd|2013-01-28 16:11:07
456|kkk|jjj|sss|2013-01-28 16:11:07
789|bbb|ccc|ddd|2013-01-28 16:11:07
123|kkk|jjj|sss|2013-02-21 16:11:07
135|bbb|ccc|ddd|2013-01-28 16:11:07
789|kkk|jjj|sss|2013-02-21 16:11:07
b.txt :
123|OFF
456|ON
789|OFF
135|ON
246|ON
依据第一列作为关键字,把 b 文件第二列续接到 a 文件末尾,生成新的文件 c.
对c进行关键字去重,去重记录保留一条时间字段最新的字段.
filea=a.txt
fileb=b.txt
n=0
m=0
while read linea
do
let "n=n+1"
noa1=`echo $linea|awk -F "|" 'print $1'`
while read lineb
do
let "m=m+1"
nob1=`echo $lineb|awk -F "|" 'print $1'`
nob2=`echo $lineb|awk -F "|" 'print $2'`
if [ "$noa1" = "$nob1" ]
then
echo "$linea|$nob2">>c.txt
fi
done<$fileb
done<$filea
这个脚本已经可以把文件按照你要求合并了,不过按照时间字段比较我一时还没想出来怎么弄,请高手补充吧 参考技术B 看看这个:
[seesea@UC ~]$ join -t'|' <(sort -t'|' -k1,1 -r -k5,5 a.txt | uniq -w3 | sort -t'|' -k1,1) <(sort -t'|' -k1,1 b.txt) > c.txt
[seesea@UC ~]$ cat c.txt
123|kkk|jjj|sss|2013-02-21 16:11:07|OFF
135|bbb|ccc|ddd|2013-01-28 16:11:07|ON
456|kkk|jjj|sss|2013-01-28 16:11:07|ON
789|kkk|jjj|sss|2013-02-21 16:11:07|OFF
-------------------
另一个方案:
[seesea@UC ~]$ awk -F'|' 'NR==FNRb[$1]=$2; NR!=FNRa[$1]=$0 OFS b[$1]; ti[$1]=(ti[$1]<$5?$5:ti[$1]); ENDfor (i in a)if (a[i]~ti[i]) print a[i]' b.txt a.txt > c.txt
[seesea@UC ~]$ cat c.txt
456|kkk|jjj|sss|2013-01-28 16:11:07 ON
123|kkk|jjj|sss|2013-02-21 16:11:07 OFF
135|bbb|ccc|ddd|2013-01-28 16:11:07 ON
789|kkk|jjj|sss|2013-02-21 16:11:07 OFF
-------------------
两方案都破坏原有的顺序,如果你要保持 a.txt 中的顺序,你另外做个排序吧本回答被提问者采纳
Linux使用shell脚本实现增量备份文件Linux合并历史备份文件Linux中find命令查询tar -cvzf文件生成压缩包Linux压缩包合并
#!bin/bash
#数据存储的地址
dataPath='opt/zndz/bin/logs/';
#查询存储地址中两天内修改或创建的文件,$dataPath前面加上/是因为存储路径中没有带上opt前面没有/
findDataPaths=`find /$dataPath -ctime -2 -type f`
#临时目录,用于保存
temp_path='/opt/temp_backups/';
#创建临时文件目录
sudo mkdir -p $temp_path
#开始循环处理查询到的文件
for path in $findDataPaths
do
#创建临时存储目录,用于下方复制使用
sudo mkdir -p $temp_path$path%/*
#将查询到的文件复制到新建目录中
sudo cp $path $temp_path$path%/*
echo $path%/* #打印文件路径
echo $path##*/ #打印文件名字
done;
#获取上一次备份的文件压缩文件
oldTarPath=`find /opt/ -name '*backup.tar'`
#创建时间,用于压缩包命名
createTime=$(date +%Y%m%d)-$(date +%H%M%S);
#进入临时存储文件目录
cd $temp_path
#新备份文件的名字
newBackupPath='/opt/logs-'$createTime'-backup.tar'
#将删选的数据生成压缩包,前段是压缩包命名,后段是数据存放地址
sudo tar -cvzf $newBackupPath $dataPath
#删除临时存放目录
sudo rm -rf $temp_path
#如果没有老文件则不合并,有则使用cat进行合并压缩包
if [ ! -n "$oldTarPath" ]; then
echo '没有发现历史压缩包'
else
#这里使用cd切换目录是为了防止出现 sudo: unable to resolve current working directory
cd /$dataPath
#合并文件时间
mergeTime=$(date +%Y%m%d)-$(date +%H%M%S)
#生成合并的新压缩包
sudo cat $oldTarPath $newBackupPath > /opt/logs-$mergeTime-backup.tar
#这里使用cd切换目录是为了防止出现 sudo: unable to resolve current working directory
cd /$dataPath
#删除上个版本老备份数据
sudo rm -f $oldTarPath
#删除合成前的新备份数据
sudo rm -f $newBackupPath
fi
1、没有历史备份文件执行后效果如下
2.1、有历史备份的执行,为了方便查看,本次执行注释掉了历史版本的删除
:
执行后会生成三个压缩包,第一个是历史备份文件,第二个是本次备份文件,第三个是合并后的备份文件
2.2、有历史备份的执行,本次执行没有注释掉删除历史版本,图一是执行前,图二是执行后
以上是关于linux文件合并,关键字去重复shell脚本的主要内容,如果未能解决你的问题,请参考以下文章
Linux使用shell脚本实现增量备份文件Linux合并历史备份文件Linux中find命令查询tar -cvzf文件生成压缩包Linux压缩包合并
Linux使用shell脚本实现增量备份文件Linux合并历史备份文件Linux中find命令查询tar -cvzf文件生成压缩包Linux压缩包合并
Linux使用shell脚本实现增量备份文件Linux合并历史备份文件Linux中find命令查询tar -cvzf文件生成压缩包Linux压缩包合并