免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4490 | 回复: 29
打印 上一主题 下一主题

(急,拜托各位了)如何将文件中的若干行删除 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-11 10:28 |只看该作者 |倒序浏览
文件a如下:
111|abc|19990202
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|www|20001202
444|eee|20030311
555|bbb|20020302
666|aaa|20030102
..............................(大约数万行)
第三个域为时间,现在的问题是如果两个记录的第一个域相同,则根据第三个域
的时间来判断,时间新的记录有效,删除时间旧的那条记录。如何删除那条旧的记录。
另:因为文件很大,约数万行,如何做一个循环,删除那些时间旧的记录。

论坛徽章:
0
2 [报告]
发表于 2003-03-11 11:04 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除


  1. sort -r -t'|' -n -k1,1 -k3,3 a  | sort -u -t'|' -k1,1 > b
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-03-11 11:11 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

  1. sort -t"|" +0 -1 +2 -r FILE| awk -F"|" 'BEGIN{f=0}{if (f==0)  f=1;f1=$1;print $0} else if (f1!=$1) {f1=$1; print $0}}' >NEW_FILE
复制代码


aix 测试通过

论坛徽章:
0
4 [报告]
发表于 2003-03-11 11:15 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

在我的hp_ux下测试通过!!!
真是感谢biansj
致以万分谢意。

论坛徽章:
0
5 [报告]
发表于 2003-03-11 14:59 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

我相信如果文件很大,而且需要经常执行的话,用perl效率会高很多

-------------------------------------------------------
#!/usr/bin/perl -w
use strict;
die "You must apply filename!" if (!$ARGV[0]);
open TEST,"<$ARGV[0]"               
        or die "Something wrong: $!";
my %index;
my %content;
while(<TEST>{
        chomp;
        s/\|/:/g;
        my @ttt=split /:/,$_;
        if ($index{$ttt[0]}){
                if ($index{$ttt[0]} lt $ttt[2]){
                        $content{$ttt[0]}=$ttt[1];
                        $index{$ttt[0]}=$ttt[2];
                }
        } else {
                $index{$ttt[0]}=$ttt[2];
                $content{$ttt[0]}=$ttt[1];
        }
}
foreach (sort keys %index){
print $_."|".$content{$_}."|".$index{$_}."\n";
}
--------------------------------------------------------

论坛徽章:
0
6 [报告]
发表于 2003-03-12 08:06 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

...


呵呵,你们把作业都做完了,没偶啥事了~~~,所以,只好挑你们的毛病了,哈哈~~~

biansj 不愧是姜是老的辣呀,最快而且就那么几个字就搞掂了~~ 厉害!

taige 可惜了,写得很漂亮,没有得到楼主的首肯,可能是楼主没测试成功,仅仅是因为漏写了一个花括号,呵呵( f=1 前面,左花括号)

二流猫的perl脚本最快,毕竟perl解释器还是比shell高效。

但这还不是最快的,下面这个更快。仍然是用awk写,但是因为没有用到排序,所以占了点便宜。对于排超大量数据时,就比较明显了。

  1. #!/bin/sh

  2. # 多数系统用 awk 就行,不一定要写 nawk  
  3. nawk -F'|' 'BEGIN {n=0}
  4.     {
  5.     if ( $1 in item ) {
  6.             if ( item[$1] < $3 ) {
  7.             value[$1] = $2
  8.             item[$1] = $3
  9.           }
  10.           next
  11.     }
  12.             prim[n++] = $1
  13.             value[$1] = $2
  14.             item[$1] = $3
  15. }
  16. END {
  17.     for ( i=0; i<n; i++ ) {
  18.        print prim[i]"|"value[prim[i]]"|"item[prim[i]]
  19.     }
  20. }' filename
复制代码


下面是我的测试,108万条记录。

# wc -l filename
1080008 filename

(用 time cmd 来测试)

# for i in rp.*; do echo "==========$i==========="; time  ./$i; done

==========rp.biansj.sh===========
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|www|20001202
555|bbb|20020302
666|aaa|20030102

real    2m28.822s     biansj 的需约2分27秒,
user    2m25.220s     哦,好象是结果跟别人的有点出入 444 那一行,可能是漏了什么
sys     0m2.050s
==========rp.elium.pl===========
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|eee|20030311
555|bbb|20020302
666|aaa|20030102

real    0m51.667s      二流猫的大约是50秒钟
user    0m49.660s
sys     0m0.150s
==========rp.sleeve.sh===========
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|eee|20030311
555|bbb|20020302
666|aaa|20030102

real    0m16.763s      偶的,大约16秒钟,哈哈,赏自己一个冰淇淋~~~
user    0m15.710s
sys     0m0.190s
==========rp.taige.sh===========
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|eee|20030311
555|bbb|20020302
666|aaa|20030102

real    2m43.024s      taige的,大约是2分40秒
user    2m41.200s
sys     0m1.250s


你们不会打我吧? @_@

论坛徽章:
0
7 [报告]
发表于 2003-03-12 08:25 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

红袖姐,把心搁到肚里!






————————————————————
什么时候俺才能有红袖姐一半的智商呢?!

论坛徽章:
0
8 [报告]
发表于 2003-03-12 09:44 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

臭袖子!!!
果然不错!!!
学习!!!

论坛徽章:
0
9 [报告]
发表于 2003-03-12 12:21 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

原帖由 "红袖添香" 发表:
=========rp.biansj.sh===========
111|aaa|20010101
222|dfg|19990202
333|qwe|19990208
444|www|20001202
555|bbb|20020302
666|aaa|20030102

real    2m28.822s     biansj 的需约2分27秒,
us..........


好你个红袖添香,请我吃冰淇淋,我要吃最大最贵的,宰死你! :wink:  :wink:

看你下一次还敢挑我毛病!

不过我牙不太好!

论坛徽章:
0
10 [报告]
发表于 2003-03-12 13:14 |只看该作者

(急,拜托各位了)如何将文件中的若干行删除

原帖由 "biansj" 发表:


好你个红袖添香,请我吃冰淇淋,我要吃最大最贵的,宰死你! :wink:  :wink:

看你下一次还敢挑我毛病!

不过我牙不太好!


哈更大肆
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP