linux文件行排序去重结果不同sort和uniq

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件行排序去重结果不同sort和uniq相关的知识,希望对你有一定的参考价值。

对文件排序去重计算行数发现用两种方法得到的结果不一样
# sort users_with_tokens_expire20131001 |uniq -u|wc -l
8642
# sort -u users_with_tokens_expire20131001 |wc -l
8671
请问是什么导致的?

参考技术A 骚年,你有仔细观察者两个命令吗?
举个例子:
文件filea为:
a
b
c
c
d
b
执行sort filea |uniq -u |wc -l,先排序,则删除了c和b的行;
执行sort -u filea |wc -l,排序,同时删除相同的行,则只删除c行。
参考技术B uniq命令的帮助:
-u, --unique:only print unique lines

第一个方法中,你加上-u选项导致了uniq只输出唯一存在的行,有重复的行被过滤掉了
所以,问题出在你的地一种方法上

解决方法:uniq中不适用-u选项本回答被提问者采纳

Linux 去重 先sort再uniq

从uniq命令的帮助信息中可以看到,该命令只过滤相邻的重复行.

如果要去掉所有重复行,需要先排序,或者使用uniq -u

$ uniq --h
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
Filter adjacent matching lines from INPUT (or standard input),
writing to OUTPUT (or standard output).

With no options, matching lines are merged to the first occurrence.

Mandatory arguments to long options are mandatory for short options too.
  -c, --count           prefix lines by the number of occurrences
  -d, --repeated        only print duplicate lines, one for each group
  -D                    print all duplicate lines
      --all-repeated[=METHOD]  like -D, but allow separating groups
                                 with an empty line;
                                 METHOD={none(default),prepend,separate}
  -f, --skip-fields=N   avoid comparing the first N fields
      --group[=METHOD]  show all items, separating groups with an empty line;
                          METHOD={separate(default),prepend,append,both}
  -i, --ignore-case     ignore differences in case when comparing
  -s, --skip-chars=N    avoid comparing the first N characters
  -u, --unique          only print unique lines
  -z, --zero-terminated     line delimiter is NUL, not newline
  -w, --check-chars=N   compare no more than N characters in lines
      --help     display this help and exit
      --version  output version information and exit

A field is a run of blanks (usually spaces and/or TABs), then non-blank
characters.  Fields are skipped before chars.

Note: uniq does not detect repeated lines unless they are adjacent.
You may want to sort the input first, or use sort -u without uniq.
Also, comparisons honor the rules specified by LC_COLLATE.

 

$ cat tmp.txt
aa
aa
bb
bb
bb
cc
cc
aa
cc
bb
$ cat tmp.txt | uniq
aa
bb
cc
aa
cc
bb

 

先sort再uniq可以去除所有重复项:

$ cat tmp.txt | sort | uniq
aa
bb
cc

 

 或者使用uniq -u:

$ cat tmp.txt | uniq -u
aa
cc
bb

但是这种方法不一定起效(参考下面的例子)

 

$ head info.json -n20 | jq .industry | awk -F " {print $2} | awk {if (length > 0) print $0} | uniq | sort # ==> 没有去重
商务服务业
建筑装饰和其他建筑业
批发业
批发业
批发业
机动车、电子产品和日用产品修理业
研究和试验发展
纺织服装、服饰业
计算机、通信和其他电子设备制造业
软件和信息技术服务业
道路运输业
零售业
$ head info.json -n20 | jq .industry | awk -F " {print $2} | awk {if (length > 0) print $0} | uniq -u | sort  # ==> 去重不完全
商务服务业
建筑装饰和其他建筑业
批发业
批发业
机动车、电子产品和日用产品修理业
研究和试验发展
纺织服装、服饰业
计算机、通信和其他电子设备制造业
软件和信息技术服务业
道路运输业
零售业
$ head info.json -n20 | jq .industry | awk -F " {print $2} | awk {if (length > 0) print $0} | sort | uniq  # ==> 去重成功
商务服务业
建筑装饰和其他建筑业
批发业
机动车、电子产品和日用产品修理业
研究和试验发展
纺织服装、服饰业
计算机、通信和其他电子设备制造业
软件和信息技术服务业
道路运输业
零售业

 

以上是关于linux文件行排序去重结果不同sort和uniq的主要内容,如果未能解决你的问题,请参考以下文章

Linux 去重 先sort再uniq

使用uniq命令给日志文件去重并排序

利用Linux命令行进行文本按行去重并按重复次数排序

linux:如何对文本里的相同行进行去重

Linux 排序命令之 sort, wc, uniq

Linux高级命令