一个两列数据比较排序的问题
-
- 帖子: 2
- 注册时间: 2008-04-03 22:57
一个两列数据比较排序的问题
我有这样一个文件:
61.178.231.13 201110290239
219.128.82.18 201110290446
27.149.37.60 201110290752
60.168.117.255 201110291009
59.46.80.170 201110291102
60.168.117.255 201110291104
218.86.50.149 201110291107
120.42.146.210 201110291151
61.144.130.200 201110291151
120.42.146.210 201110291152
120.42.146.210 201110291153
59.46.80.170 201110291200
59.46.80.170 201110291203
第一列是IP,第二列是时间,以空格分隔。
我希望处理的结果是:
去掉重复的IP行,如果IP相同,那么保留时间最近的行。
即:
120.42.146.210 201110291153
218.86.50.149 201110291107
219.128.82.18 201110290446
27.149.37.60 201110290752
59.46.80.170 201110291203
60.168.117.255 201110291104
61.144.130.200 201110291151
这个应该怎么做啊?用二维数组吗?
61.178.231.13 201110290239
219.128.82.18 201110290446
27.149.37.60 201110290752
60.168.117.255 201110291009
59.46.80.170 201110291102
60.168.117.255 201110291104
218.86.50.149 201110291107
120.42.146.210 201110291151
61.144.130.200 201110291151
120.42.146.210 201110291152
120.42.146.210 201110291153
59.46.80.170 201110291200
59.46.80.170 201110291203
第一列是IP,第二列是时间,以空格分隔。
我希望处理的结果是:
去掉重复的IP行,如果IP相同,那么保留时间最近的行。
即:
120.42.146.210 201110291153
218.86.50.149 201110291107
219.128.82.18 201110290446
27.149.37.60 201110290752
59.46.80.170 201110291203
60.168.117.255 201110291104
61.144.130.200 201110291151
这个应该怎么做啊?用二维数组吗?
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
这个差不多了,如果你的日期的年份是一致的话
PS: 第一次发此帖时论坛挂掉了!挂掉了好长一段时间!然后我的 X 也挂掉了,所以火狐也重启了!感谢 Textarea Cache,不然这行代码就会404了!
代码: 全选
sort -r | uniq -w 15 | tac
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 一个两列数据比较排序的问题
咳,楼上那个简单,我还真去开个emacs写了玩了
[haskell]
-- test.hs
module Main where
import Data.Monoid
import Data.List
import System.Environment
main :: IO ()
main = do
fmap head getArgs >>= readFile >>=
(\content ->
writeFile "output.txt" $ unlines $ map unwords $
nubBy (\(ip1:_) (ip2:_) -> ip1 == ip2) $
sortBy (\(ip1:t1:_) (ip2:t2:_) ->
(compare ip1 ip2) `mappend`
(compare t2 t1)) $ map words $ lines content
)
[/haskell]
output.txt:
120.42.146.210 201110291153
218.86.50.149 201110291107
219.128.82.18 201110290446
27.149.37.60 201110290752
59.46.80.170 201110291203
60.168.117.255 201110291104
61.144.130.200 201110291151
61.178.231.13 201110290239
[haskell]
-- test.hs
module Main where
import Data.Monoid
import Data.List
import System.Environment
main :: IO ()
main = do
fmap head getArgs >>= readFile >>=
(\content ->
writeFile "output.txt" $ unlines $ map unwords $
nubBy (\(ip1:_) (ip2:_) -> ip1 == ip2) $
sortBy (\(ip1:t1:_) (ip2:t2:_) ->
(compare ip1 ip2) `mappend`
(compare t2 t1)) $ map words $ lines content
)
[/haskell]
代码: 全选
ghc --make test.hs
./test yourfile.txt
120.42.146.210 201110291153
218.86.50.149 201110291107
219.128.82.18 201110290446
27.149.37.60 201110290752
59.46.80.170 201110291203
60.168.117.255 201110291104
61.144.130.200 201110291151
61.178.231.13 201110290239
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
看不懂求入门教程tangboyun 写了:咳,楼上那个简单,我还真去开个emacs写了玩了
[haskell]
-- test.hs
module Main where
import Data.Monoid
import Data.List
import System.Environment
main :: IO ()
main = do
fmap head getArgs >>= readFile >>=
(\content ->
writeFile "output.txt" $ unlines $ map unwords $
nubBy (\(ip1:_) (ip2:_) -> ip1 == ip2) $
sortBy (\(ip1:t1:_) (ip2:t2:_) ->
(compare ip1 ip2) `mappend`
(compare t2 t1)) $ map words $ lines content
)
[/haskell]

- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 一个两列数据比较排序的问题
Learn You a Haskell for Great Good!把数学概念写的很有趣,算是最好的haskell入门教材了。如果只有过程式经验的话,哪怕最简单的章节也别跳读,不然到最后funtor、monoid、monad这些地方会卡壳。
http://learnyouahaskell.com/chapters
vim的一些配置资料:
http://www.reddit.com/r/haskell/comment ... _cool_vim/
emacs的:
http://www.reddit.com/r/haskell/comment ... what_cool/
http://learnyouahaskell.com/chapters
vim的一些配置资料:
http://www.reddit.com/r/haskell/comment ... _cool_vim/
emacs的:
http://www.reddit.com/r/haskell/comment ... what_cool/
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 一个两列数据比较排序的问题
[quote="lilydjwg"]这个差不多了,如果你的日期的年份是一致的话
#动态数据能用静态算法?
代码: 全选
sort -r | uniq -w 15 | tac
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
懒得读那么长的文章了。nubBy 和 >>= 是什么?tangboyun 写了:Learn You a Haskell for Great Good!把数学概念写的很有趣,算是最好的haskell入门教材了。如果只有过程式经验的话,哪怕最简单的章节也别跳读,不然到最后funtor、monoid、monad这些地方会卡壳。
http://learnyouahaskell.com/chapters
vim的一些配置资料:
http://www.reddit.com/r/haskell/comment ... _cool_vim/
emacs的:
http://www.reddit.com/r/haskell/comment ... what_cool/
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 一个两列数据比较排序的问题
>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道
nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
谢谢。还有两点没弄懂:fmap 和 mappend 是干什么的?fmap 和 map 有什么不同呢?tangboyun 写了:>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道
nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 一个两列数据比较排序的问题
fmap 是functor里的概念。相当于将外部函数应用到functor类上(这里是将一个纯函数head应用于functor类,也就是IO,最后仍然保留在IO中),最后仍保留functor环境。
mappend是monoid的概念。monoid主要是抽象两个数学概念mzero和mplus,一个是0点,怎么说呢,比如加法里0就是0点,乘法里则是1,在连续的加法或者连乘里,零点是不起作用的。这里比较这个操作的类型是Ordering,数学上讲是个monoid,mappend也就是mplus,表示个递推关系(相等则是0点),第一个相等考虑第二个。这里的实际意义是抽象了一些可以短路的操作,比如传统意义上一些编程语言里的and操作符上,可以把ture看成0点,而or操作把false看成0点。
这两个概念恐怕不能三言两语说清楚。可以考虑查看我上面给出链接里的Functor和monoid部分。
mappend是monoid的概念。monoid主要是抽象两个数学概念mzero和mplus,一个是0点,怎么说呢,比如加法里0就是0点,乘法里则是1,在连续的加法或者连乘里,零点是不起作用的。这里比较这个操作的类型是Ordering,数学上讲是个monoid,mappend也就是mplus,表示个递推关系(相等则是0点),第一个相等考虑第二个。这里的实际意义是抽象了一些可以短路的操作,比如传统意义上一些编程语言里的and操作符上,可以把ture看成0点,而or操作把false看成0点。
这两个概念恐怕不能三言两语说清楚。可以考虑查看我上面给出链接里的Functor和monoid部分。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
好吧,mplus 是幺半群(独异点)里的单位元,mappend 是 m·append,不是 map·p·end,如果左操作数为单位元则返回右操作数,否则返回左操作数,是这样吗?唉,看来想学好 Haskell 得先学好线性代数啊。tangboyun 写了:fmap 是functor里的概念。相当于将外部函数应用到functor类上(这里是将一个纯函数head应用于functor类,也就是IO,最后仍然保留在IO中),最后仍保留functor环境。
mappend是monoid的概念。monoid主要是抽象两个数学概念mzero和mplus,一个是0点,怎么说呢,比如加法里0就是0点,乘法里则是1,在连续的加法或者连乘里,零点是不起作用的。这里比较这个操作的类型是Ordering,数学上讲是个monoid,mappend也就是mplus,表示个递推关系(相等则是0点),第一个相等考虑第二个。这里的实际意义是抽象了一些可以短路的操作,比如传统意义上一些编程语言里的and操作符上,可以把ture看成0点,而or操作把false看成0点。
这两个概念恐怕不能三言两语说清楚。可以考虑查看我上面给出链接里的Functor和monoid部分。
functor类是什么东东?光 getArgs 的返回值好像都不简单啊。。。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
原来还有个 rev 命令~fnan 写了:sort -rn file.txt|rev|uniq -f1|rev
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个两列数据比较排序的问题
[python]
#!/usr/bin/env python3
# vim:fileencoding=utf-8
import sys
from functools import cmp_to_key
def cmp(a, b):
return (a > b) - (a < b)
for fname in sys.argv[1:]:
lines = [x.split() for x in open(fname)]
lines.sort(key=cmp_to_key(lambda x, y: cmp(x[0], y[0]) or cmp(x[1], y[1])))
it = iter(lines)
a = next(it)
b = next(it)
new = []
try:
while True:
if a[0] != b[0]:
new.append(a)
a, b = b, next(it)
except StopIteration:
new.append(b)
sys.stdout.writelines([' '.join(x) + '\n' for x in new])
[/python]
Python 3 不给力呀。
#!/usr/bin/env python3
# vim:fileencoding=utf-8
import sys
from functools import cmp_to_key
def cmp(a, b):
return (a > b) - (a < b)
for fname in sys.argv[1:]:
lines = [x.split() for x in open(fname)]
lines.sort(key=cmp_to_key(lambda x, y: cmp(x[0], y[0]) or cmp(x[1], y[1])))
it = iter(lines)
a = next(it)
b = next(it)
new = []
try:
while True:
if a[0] != b[0]:
new.append(a)
a, b = b, next(it)
except StopIteration:
new.append(b)
sys.stdout.writelines([' '.join(x) + '\n' for x in new])
[/python]
Python 3 不给力呀。
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 一个两列数据比较排序的问题
发现一个google tech-talk的slides,将haskell和一些shell操作做的对比吧,fmap的解释也比我说的详细的多。haskell的语法特性简略的过了一遍。
Tech-talk about Haskell at Google: Haskell Amuse-Bouche
http://www.ozonehouse.com/mark/haskell- ... lides.html
Tech-talk about Haskell at Google: Haskell Amuse-Bouche
http://www.ozonehouse.com/mark/haskell- ... lides.html
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。