shell脚本取重复数据的最后一条记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本取重复数据的最后一条记录相关的知识,希望对你有一定的参考价值。

在shell中对一个.unl文件进行“去重”。对重复的记录取最后一条记录和原有的数据重新覆盖原有文件,且将重复的记录输入到一个err*.unl文件中...

  假设你这个.unl文件叫 file.unl,并且内容不含斜杠 / 。
  脚本大致如下:

  #!/bin/bash
  myfile=file.unl
  touch tmp
  while read line
  do
  grep "$line" tmp >/dev/null 2>&1
  if [ $? -eq 0 ]; then
  num=`awk 'print $NF' tmp`
  num=`expr $num + 1`
  sed -i “s/^\($line\t\)[0-9]*$/\1$num/” tmp
  else
  echo -e "$line\t1" >>tmp
  fi
  done <$myfile # ---> 1), 2)
  awk '$NF>1print' tmp >err.unl # ---> 3)
  sed -i 's/^\(..*\)\t[0-9]*$/\1/' tmp
  mv -f tmp $myfile # ---> 4)
  exit 0

  思路就是,
  1)遍历 unl 文件的每一行,逐行拷贝一份到临时文件tmp中,后面附加一个出现的次数。
  2)遍历的同时到tmp文件中去查找是否有已存在的相同记录,如果有,就只是更新tmp文件中记录的次数而不添加一个新记录。
  3)最后根据tmp文件中记录的次数是否大于1来生成err.unl文件,记录重复的行及总共出现的次数。
  4)将tmp文件中的次数记录去除即得到更新后的 unl 文件。
  由于要求要覆盖原unl文件,所以这里存在风险。 建议运行脚本前先备份一下原unl文件。

  最后,恕我直言,这个题目的难度不止10分。
  你看,while循环,grep / sed / awk,全用上了 ^_^
  ————————————————————————————————————
  发现一个更简练的方法,两条命令即可搞定:
  awk 's[$0]+=1 ENDfor(a in s) print a, s[a]' file.unl >err.unl
  awk 'print $1' err.unl >file.unl
  当然,前提是unl文件的每行内容不能含有空格或TAB之类的分隔符。
  参考了 http://zhidao.baidu.com/question/271261293.html#here 这个问题中shuguangbo童鞋的回答。
参考技术A 是否可以这样?
用sort排序一下,然后uniq -c 来去重复并统计。然后用awk 把统计出来超过1的写入到err.unl
sort file.unl|uniq -c > tmp.file
awk 'if($1>1)print $2>err.unl
awk 'print $2' tmp.file > file.unl
rm tmp.file
参考技术B 已知一个文本文件可能存在重复记录,但是ID经过重新编排已经不同了。如何用...不知道是不是Linux的shell,如果是UNIX,就把下面的/bin/bash改为相应的...追问

就是在linux下面的shell,就是对下面的unl数据文件进行操作!

追答

已知一个文本文件可能存在重复记录,但是ID经过重新编排已经不同了。如何用...不知道是不是Linux的shell,如果是UNIX,就把下面的/bin/bash改为相应的...

oracle 取第一条或者最后一条记录

主键id 使用的sys_guid()函数自动生成的
现在有一堆记录 我需要做的是 取得最新添加的一条记录(可按照时间排序) 请问该怎样做呢?

如果你的表非常大,那查询最新添加的一条记录就尽量让ORACLE走主键索引。
select * from table_name where id in (select max(id) from table_name);
这样ORACLE会走索引快速扫描得出最后一条ID的值,然后通过唯一索引得出最后一条记录,这样效率较高。
参考技术A SELECT * FROM (
           SELECT * FROM TBL_TEST T
             ORDER BY T.TIME DESC
            ) WHERE ROWNUM < 2

取rownum为1的也就是小于2的就可以

追问

select x.id from(select s.id ,rownum num from(select t.id from table_name t order by t.date)s)x where x.num=(select count(id)from table_name)
刚才这样写试了下暂时还没发现有什么问题,还是谢谢你们了

本回答被提问者采纳
参考技术B 1、要求很精确地话只能用程序实现了。
2、也可以使用oracle的伪劣ORA_ROWSCN。
select * from (select t.*,ORA_ROWSCN oscn from t1 t ) where oscn =(select max(ora_rowscn) from t1) ;
3、只查最近的,可以查询flashback_transaction_query视图
参考技术C SELECT * FROM (SELECT T.*,ROWNUM RN FROM TABLE_NAME T ORDER BY ROWNUM DESC ) WHERE ROWNUM=1

以上是关于shell脚本取重复数据的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

多表查询结果出现重复记录,根据条件只取其中的一条记录的sql语句

oracle 取重复数据中一条

如何获取mysql重复项中的最后一条数据

hive如何去掉重复数据,显示第一条

mysql删除重复数据,保留一条

如何在数据库中查询出重复记录