采用 awk '!x[$0]++' filename 只能去除完全相同的重复值, awk '!x[$1]++' filename 只能根据第一列的值去重。
现在想要根据多列的数据去重,何解?
(不能借助数据库,或者还有其他的命令能解决?
1
knightdf 2016-12-26 15:03:36 +08:00 1
把这几列拼成字符串再去重不就行了?
|
2
imn1 2016-12-26 15:08:13 +08:00 1
csvtool 辅助
|
4
swulling 2016-12-26 15:51:39 +08:00
awk '!x[$0","$1","$3]++',思路要广
|
7
imn1 2016-12-26 16:16:54 +08:00
|
9
xss 2016-12-26 17:04:26 +08:00 1
step 0 : 将要去重的列拼接成一个字符串然后算一个 hash(以 md5 为例, 只要保证位数固定就行)得到列 A
step 1 : 将列 A 当做第一列, 原始日志当做剩余的列输出 step 2 : uniq 有一个参数 -w, --check-chars=N 对每行第 N 个字符以后的内容不作对照 所以, uniq -w32 列 A 为第一列的日志.log 即可完成多列去重. 例子命令(a.log 中, 根据第一列和第三列去重): ``` user@host [16:58:30] : ~ >> cat a.log | awk '{cmd="echo -ne " $1$3"|md5sum -";cmd|getline result;print result"\t"$0}'|sort|uniq -w32 -c 1 7b19de6d4d54999531beb27f758f71f6 - 111 222 333 444 1 c17ed7d7e2d8a60c78c715e165fe3c38 - 111 888 444 666 2 ec1e7077d02cb3dbd61ab73018c4a319 - 111 666 333 777 user@host [16:58:49] : ~ >> cat a.log 111 222 333 444 222 333 444 555 111 666 333 777 111 888 444 666 ``` |
12
Ginson 2016-12-26 18:47:47 +08:00
好不容易看到个我能答的,被抢先了,哭…
|