linux uniq sort 排重、排序

本文详细介绍了 Linux 系统中 uniq 和 sort 命令的高级用法,包括如何利用 uniq 对文件内容进行去重并统计重复次数,以及如何使用 sort 实现对多个列值进行复杂排序,特别强调了逆序排列和指定分隔符的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有如下文件a.txt

[root@m95] /ftproot# cat a.txt
ttt|000001
uuu|000002
uuu|000002
uuu|000002
uuu|000002
1
2
3
4
5
6
7
77
8
9
9

=====================================

#cat a.txt | uniq -c -i | sort -k2 -n          排重,排重输出的第二列正序排列
#cat a.txt | uniq -c -i | sort -k2 -rn         排重,排重输出的第二列逆序排列

uniq 参数解释

     -c 统计重复数量


     -c      Precede each output line with the count of the number of times
             the line occurred in the input, followed by a single space.

     -d      Only output lines that are repeated in the input.

     -f num  Ignore the first num fields in each input line when doing compar-
             isons.  A field is a string of non-blank characters separated
             from adjacent fields by blanks.  Field numbers are one based,
             i.e., the first field is field one.

     -s chars
             Ignore the first chars characters in each input line when doing
             comparisons.  If specified in conjunction with the -f option, the
             first chars characters after the first num fields will be
             ignored.  Character numbers are one based, i.e., the first char-
             acter is character one.

     -u      Only output lines that are not repeated in the input.

     -i      Case insensitive comparison of lines.

=============================================================================

linux关于sort命令的高级用法(按多个列值进行排列)

如果单纯地使用sort按行进行排序比较简单,

但是使用sort按多个列值排列,同时使用tab作为分隔符,而且对于某些列需要进行逆序排列,这样sort命令写起来就比较麻烦了

比如下面的文件内容,使用[TAB]进行分割:

Group-ID   Category-ID   Text        Frequency
----------------------------------------------
200        1000          oranges     10
200        900           bananas     5
200        1000          pears       8
200        1000          lemons      10
200        900           figs        4
190        700           grapes      17

下面使用这些列进行排序(列4在列3之前进行排序,而且列4是逆序排列)

    * Group ID (integer)
    * Category ID (integer)
    * Frequency “sorted in reverse order” (integer)
    * Text (alpha-numeric)

排序后的结果应该为:

Group-ID   Category-ID   Text        Frequency
----------------------------------------------
190        700           grapes      17
200        900           bananas     5
200        900           figs        4
200        1000          lemons      10
200        1000          oranges     10
200        1000          pears       8

可以直接使用sort命令来解决这个问题:

BASH CODE
sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 <my-file>

解释如下:

-t $'\t':指定TAB为分隔符
-k 1, 1: 按照第一列的值进行排序,如果只有一个1的话,相当于告诉sort从第一列开始直接到行尾排列
n:代表是数字顺序,默认情况下市字典序,如10<2
r: reverse 逆序排列,默认情况下市正序排列

所以最后的命令:sort -t $’\t’ -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 my-file


### 使用 `sort` 和 `uniq` 对文件内容进行排序和去 对于 Linux 环境下文件内容的排序与去操作,可以通过组合使用 `sort` 和 `uniq` 命令来实现。 #### 排序并去除复行 当需要对文件中的每一行按特定顺序列,并移除相邻的复项时,可以采用以下方式: ```bash $ sort file.txt | uniq ``` 此命令首先通过 `sort` 将 `file.txt` 文件的内容依据默认字典顺序进行升序列[^2];接着利用 `uniq` 移除非唯一连续出现的行。需要注意的是,`uniq` 只能删除相连的复条目,因此通常会先做一次排序以确保相同的记录被聚集在一起[^3]。 如果希望得到的结果不仅限于直接前后相接的情况,则应考虑增加 `-d` 参数给 `uniq` 来仅保留那些确实存在多份拷贝的数据行,或是借助其他工具如 `awk` 或者再次调用 `sort -u` 实现全局范围内的不复化处理。 另外一种更简洁的方法是在单次 `sort` 调用中完成这两步工作: ```bash $ sort -u file.txt ``` 这里 `-u` 选项指示 `sort` 自动过滤掉多余的副本而只留下独一无二的那一部分[^1]。 #### 进阶应用实例 假设有一个名为 `input.txt` 的文本文件,其内部含有若干整数以及字母字符混合而成的一系列字符串。为了获取一份既经过数值大小又无冗余版本的新列表,可采取下面这条指令链路: ```bash $ cat input.txt | sort -n | uniq ``` 上述语句里加入了额外参数 `-n` 给到 `sort` ,使得整个集合能够基于纯数字逻辑新编位置关系后再交由 `uniq` 处理多余元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值