|
蓝森林 http://www.lslnet.com 2006年6月26日 11:18
(急,拜托各位了)如何将文件中的若干行删除
文件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
..............................(大约数万行)
第三个域为时间,现在的问题是如果两个记录的第一个域相同,则根据第三个域
的时间来判断,时间新的记录有效,删除时间旧的那条记录。如何删除那条旧的记录。
另:因为文件很大,约数万行,如何做一个循环,删除那些时间旧的记录。 |
(急,拜托各位了)如何将文件中的若干行删除
[code]
sort -r -t'|' -n -k1,1 -k3,3 a | sort -u -t'|' -k1,1 > b
[/code] |
(急,拜托各位了)如何将文件中的若干行删除
[code]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[/code]
aix 测试通过 |
(急,拜托各位了)如何将文件中的若干行删除
在我的hp_ux下测试通过!!!
真是感谢biansj
致以万分谢意。 |
(急,拜托各位了)如何将文件中的若干行删除
我相信如果文件很大,而且需要经常执行的话,用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";
}
-------------------------------------------------------- |
(急,拜托各位了)如何将文件中的若干行删除
...
呵呵,你们把作业都做完了,没偶啥事了~~~,所以,只好挑你们的毛病了,哈哈~~~
biansj 不愧是姜是老的辣呀,最快而且就那么几个字就搞掂了~~ 厉害!
taige 可惜了,写得很漂亮,没有得到楼主的首肯,可能是楼主没测试成功,仅仅是因为漏写了一个花括号,呵呵( f=1 前面,左花括号)
二流猫的perl脚本最快,毕竟perl解释器还是比shell高效。
但这还不是最快的,下面这个更快。仍然是用awk写,但是因为没有用到排序,所以占了点便宜。对于排超大量数据时,就比较明显了。
[code]#!/bin/sh
# 多数系统用 awk 就行,不一定要写 nawk
nawk -F'|' 'BEGIN {n=0}
{
if ( $1 in item ) {
if ( item[$1] < $3 ) {
value[$1] = $2
item[$1] = $3
}
next
}
prim[n++] = $1
value[$1] = $2
item[$1] = $3
}
END {
for ( i=0; i<n; i++ ) {
print prim[i]"|"value[prim[i]]"|"item[prim[i]]
}
}' filename
[/code]
下面是我的测试,108万条记录。
# [b]wc -l filename[/b]
1080008 filename
(用 time cmd 来测试)
# [b]for i in rp.*; do echo "==========$i==========="; time ./$i; done[/b]
==========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
你们不会打我吧? @_@ |
(急,拜托各位了)如何将文件中的若干行删除
:evil: 红袖姐,把心搁到肚里!
————————————————————
什么时候俺才能有红袖姐一半的智商呢?! :roll: |
(急,拜托各位了)如何将文件中的若干行删除
臭袖子!!!
果然不错!!!
学习!!! |
(急,拜托各位了)如何将文件中的若干行删除
-->
好你个红袖添香,请我吃冰淇淋,我要吃最大最贵的,宰死你! :wink: :wink:
看你下一次还敢挑我毛病!
不过我牙不太好! :cry: :cry: |
(急,拜托各位了)如何将文件中的若干行删除
-->
哈更大肆
:D |
(急,拜托各位了)如何将文件中的若干行删除
哇塞,这么多人说你红袖姐!风紧!撤!
老头,俺也要吃,什么时候去,被忘了通知俺! |
(急,拜托各位了)如何将文件中的若干行删除
高手啊
我明天开始也要学AWK和PERL |
(急,拜托各位了)如何将文件中的若干行删除
...
:P
陪罪,陪罪!!! |
(急,拜托各位了)如何将文件中的若干行删除
一个比一个牛,厉害,佩服:)
红袖妹妹,到上海,我请你吃冰激凌:)
最便宜的那种,呵呵,本人穷:) |
(急,拜托各位了)如何将文件中的若干行删除
-->
哇噻!领导来视察来了~~~~
geee~~~ 那肯定是不穷,穷者都挺大方的。肯定是个款爷!
打劫!!!举起手来!!! |
(急,拜托各位了)如何将文件中的若干行删除
有我的份吗? |
(急,拜托各位了)如何将文件中的若干行删除
...
有份有份,小怎么会亏待了我们的小侄女呢? :)
花 是偶们的斑竹,很好说话D~~~ |
(急,拜托各位了)如何将文件中的若干行删除
-->
在红袖姐姐的修正下,我重新在我的hp_ux下策是通过了你的脚本,谢谢你,
也谢谢红袖姐姐 |
(急,拜托各位了)如何将文件中的若干行删除
是我的疏忽
还是洪秀(全)强啊! |
(急,拜托各位了)如何将文件中的若干行删除
-->
暈啊~~ |
| |