shell取多条重复数据的最后一条

任务说明:日志文件中存在多条记录,现要求取出文件中的某两列,而且是去重,取最新的一条记录(就是取这个ID最后出现的那一行的那两列)

脚本代码如下:

#shell声明
#!/bin/bash

#获取最后一行的行号
line_desc_num=`awk 'END{print NR}' log.txt`

#循环每一行,从第一行开始
for i in $line_desc_num
#进入循环
do
#取出这一行的第六列和第七列,用_隔开,并追加到一个新文件中
    output=`cat log.txt |awk -v bl=$i  -F'|' '{print $6"_"$7}'`
    echo "$output" >> /tmp/cs
#结束循环
done

#创建新文件来存储最终结果
touch newfile

#查看cs文件存为变量

all_text=`cat /tmp/cs`
#循环每一行
for k in $all_text
#开始循环
do
#取出id
  id=`echo $k|awk -F'_' '{print $1}'`
#判断这个id有没有在newfile中
  cat /tmp/newfile|grep $id >> /dev/null
#如果在$?返回的是0
   if [ $? == 0 ];then
#取出这个id的行号
   line_num=`cat /tmp/newfile|grep -n "$id"|awk -F':' '{print $1}'`
#根据行号删除该行
   sed  -i "$line_num d"  /tmp/newfile
  #追加最新数据到newfile中
    echo $k >> /tmp/newfile
#打印出信息告知原来的已删除
   echo "pristine line is  delete...."
#如果不在newfile中 
else
#打印出inserting。。。
    echo "inserting....."
#将这行追加到新文件中
    echo $i >> /tmp/newfile
#结束判断 
fi
#结束循环
done

为了测试是取的最后一次的数据,进行手动测试

测试结果成功

图中我是写的两个脚本,其实一个脚本应该也可以的,我给整合了,但是没测试。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发