2

我需要帮助来解析这样的输入。

192.168.0.168: 1
192.168.0.158: 0
192.168.0.198: 0
192.168.0.148: 0
192.168.0.158: 1
192.168.0.168: 0

如果任何 ip 的第二列有 1,我想删除第二列有 0 和第一列相同 ip 的行。所以我的输出应该是这样的。

192.168.0.168: 1
192.168.0.198: 0
192.168.0.148: 0
192.168.0.158: 1

我想这可以通过使用 awk、sed 等来完成,但我不知道该怎么做。我希望我能正确解释我的问题。谢谢...

4

6 回答 6

2

单程:

awk '
    { 
        ips[ $1 ] = ( ips[ $1 ] == 1 ) ? 1 : $2 
    } 
    END { 
        for ( ip in ips ) { 
            print ip, ips[ ip ] 
        } 
    }
' infile

这会产生(输出可能是无序的):

192.168.0.168: 1
192.168.0.198: 0
192.168.0.148: 0
192.168.0.158: 1
于 2012-08-29T07:30:13.997 回答
2

这可能对您有用(GNU sed):

cat -n file | 
sort -k2,2 -k3,3nr | 
sed ':a;$!N;/^\s*\S*\s*\(\S*\)\s*1\s*\n.*\1/s/\n.*0\s*//;ta;P;D' | 
sort -n | 
sed 's/^\s*\S*\s*//'
于 2012-08-29T07:30:51.773 回答
1

Perl 解决方案:

perl -nae '$h{ $F[0] } += $F[1]
           }{
           print "$k ", $v ? 1 : 0, "\n" while ($k, $v) = each %h'
于 2012-08-29T07:38:01.957 回答
1

几个sorts 应该这样做:

sort file -r | sort -u -k1,1

前一种排序确保这些行是有序的,这样第二列中带有 1 的行将首先出现在每个 IP 中。

后一种排序将只保留每个 IP 的第一个条目:-u-> 唯一的,-k1,1-> 仅第一列。

于 2012-08-29T07:52:50.800 回答
1
awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' your_file
于 2012-08-29T07:54:57.193 回答
1

函数式方法(haskell 编程语言):

-- function that having the two sublists with '0' and '1' ips,
-- filters and puts into   the '1' 
-- sublist all the '0' ips that are not included in '1'

fil [] result = result
fil (x: xs) result | (init x `elem` (map init result)) == False = fil xs (x:result)
            | otherwise = fil xs result


-- function that filters '0' and '1' sublists
getsublist alist character = filter (\x-> (last x) == character) alist



> let a = ["192.168.0.168: 1", "192.168.0.158: 0", "192.168.0.198: 0", "192.168.0.148: 0", "192.168.0.158: 1", "192.168.0.168: 0"]

> let b = getsublist a '0'

> let c = getsublist a '1'

> fil b c

输出:

["192.168.0.148: 0","192.168.0.198: 0","192.168.0.168: 1","192.168.0.158: 1"] 
于 2012-08-29T09:06:16.340 回答