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

sh/bash/dash/ksh/zsh等Shell脚本
勒色
帖子: 2
注册时间: 2008-04-03 22:57

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

#1

帖子 勒色 » 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

这个应该怎么做啊?用二维数组吗?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#2

帖子 lilydjwg » 2011-10-29 22:21

这个差不多了,如果你的日期的年份是一致的话

代码: 全选

sort -r | uniq -w 15 | tac
PS: 第一次发此帖时论坛挂掉了!挂掉了好长一段时间!然后我的 X 也挂掉了,所以火狐也重启了!感谢 Textarea Cache,不然这行代码就会404了!
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

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

#3

帖子 tangboyun » 2011-10-29 22:37

咳,楼上那个简单,我还真去开个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
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#4

帖子 lilydjwg » 2011-10-29 23:12

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
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

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

#5

帖子 tangboyun » 2011-10-30 0:30

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/
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#6

帖子 fnan » 2011-10-30 7:01

[quote="lilydjwg"]这个差不多了,如果你的日期的年份是一致的话

代码: 全选

sort -r | uniq -w 15 | tac
#动态数据能用静态算法?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#7

帖子 lilydjwg » 2011-10-30 13:18

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 和 >>= 是什么?
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

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

#8

帖子 tangboyun » 2011-10-30 15:54

>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道

nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#9

帖子 lilydjwg » 2011-10-30 16:14

tangboyun 写了:>>= 可以理解为在impure环境(IO 操作)里传递pure值的管道

nub是移除排序后的列表的重复项,nubBy在此基础上提供自己的函数用来比较元素相等。
谢谢。还有两点没弄懂:fmap 和 mappend 是干什么的?fmap 和 map 有什么不同呢?
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

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

#10

帖子 tangboyun » 2011-10-30 16:42

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部分。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#11

帖子 fnan » 2011-10-30 17:33

sort -rn file.txt|rev|uniq -f1|rev
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#12

帖子 lilydjwg » 2011-10-30 18:20

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 的返回值好像都不简单啊。。。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#13

帖子 lilydjwg » 2011-10-30 18:25

fnan 写了:sort -rn file.txt|rev|uniq -f1|rev
原来还有个 rev 命令~
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#14

帖子 lilydjwg » 2011-10-30 18:48

[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 不给力呀。
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

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

#15

帖子 tangboyun » 2011-10-31 3:09

发现一个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
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
回复