Linux常用命令--文本排序和去重相关命令
摘要
-
文本的排序、去重和统计行数等相关命令,如sort、uniq、wc等等
-
本文基于
CentOS8(x86_64)
sort
-
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们排序输出,默认升序。
sort基本用法
1 | # 文件内容按ASCII码值进行比较后升序输出 |
sort高级用法
-
上面结束的sort用法都是从每行的第一个字符开始比较,如果文本可以被分隔为一列一列的内容,我们想按某一列进行排序该如何处理呢?
-
为了说明这个用法,我准备了一份文件
1 | $ cat file |
-
以第二列进行排序,并按数字大小排序
1 | # -t 分隔符,-k 排序的列号 |
-
以第一列的第二个字符进行排序
1 | # 这里 -k 1.2,表示按第一列的第二个字符排序 |
小贴士
-k
的语法格式为[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
- 这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。
- Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分,比如
-k 2nr
,b、d、f、i、n 或 r
都可以用在Modifier部分。 - FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”,CStart也是可以省略的,省略的话就表示从本域的开头部分开始。
- 之前例子中的
-k 2
就是省略了CStart而只有FStart,而-k 1.2
其中的1
就是FStart,.2
就是CStart。 - End的部分的组成同Start。
- Start用于表示从第几个域的第几个字符开始,End用于表示到第几个域的第几个字符结束,如果不设定End部分,那么就认为End被设定为行尾。
-
先按第二列升序排序,第二列相同则按第三列降序排序
1 | # 看了上面的小贴士,应该可以理解这里的含义 |
-
-k
和-u
同时使用要注意,-u
去重时比较的是-k
指定的区域
1 | # 此时比较的是从第二个域到行尾是否重复,所以没有可以去掉的行 |
uniq
-
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用
1 | $ cat file |
wc
-
wc(word count)命令用于统计文件字节、字符、单词与行的数量
1 | # -l, --lines 统计行数,在统计记录数时,很常用 |