分页: 1 / 2

一个两列数据比较排序的问题

发表于 : 2011-10-29 14:07
勒色
我有这样一个文件:
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

这个应该怎么做啊?用二维数组吗?

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-29 22:21
lilydjwg
这个差不多了,如果你的日期的年份是一致的话

代码: 全选

sort -r | uniq -w 15 | tac
PS: 第一次发此帖时论坛挂掉了!挂掉了好长一段时间!然后我的 X 也挂掉了,所以火狐也重启了!感谢 Textarea Cache,不然这行代码就会404了!

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-29 22:37
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]

代码: 全选

ghc --make test.hs
./test yourfile.txt
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

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-29 23:12
lilydjwg
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]
看不懂求入门教程 :em20

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 0:30
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/

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 7:01
fnan
[quote="lilydjwg"]这个差不多了,如果你的日期的年份是一致的话

代码: 全选

sort -r | uniq -w 15 | tac
#动态数据能用静态算法?

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 13:18
lilydjwg
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/
懒得读那么长的文章了。nubBy 和 >>= 是什么?

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 15:54
tangboyun
>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道

nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 16:14
lilydjwg
tangboyun 写了:>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道

nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
谢谢。还有两点没弄懂:fmap 和 mappend 是干什么的?fmap 和 map 有什么不同呢?

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 16:42
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部分。

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 17:33
fnan
sort -rn file.txt|rev|uniq -f1|rev

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 18:20
lilydjwg
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部分。
好吧,mplus 是幺半群(独异点)里的单位元,mappend 是 m·append,不是 map·p·end,如果左操作数为单位元则返回右操作数,否则返回左操作数,是这样吗?唉,看来想学好 Haskell 得先学好线性代数啊。

functor类是什么东东?光 getArgs 的返回值好像都不简单啊。。。

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 18:25
lilydjwg
fnan 写了:sort -rn file.txt|rev|uniq -f1|rev
原来还有个 rev 命令~

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-30 18:48
lilydjwg
[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 不给力呀。

Re: 一个两列数据比较排序的问题

发表于 : 2011-10-31 3:09
tangboyun
发现一个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