常用命令: sort学习笔记

简介: 本文的sort命令是GNU版本(8.22), 和BSD的sort不同sort是我最常用Linux命令之一,它的功能就是排序,一般后面还会和uniq搭配,对数据进行去重。下面的操作假设你有一个文件,叫做chr.

本文的sort命令是GNU版本(8.22), 和BSD的sort不同

sort是我最常用Linux命令之一,它的功能就是排序,一般后面还会和uniq搭配,对数据进行去重。

下面的操作假设你有一个文件,叫做chr.txt, 内容如下, 不同列之间用制表符分隔

Chr3    20251812    20254323    +
Chr1    471971    473336    -
Chr3    21701520    21703114    +
Chr3    18709613    18710836    +
Chr5    25645209    25646845    -
Chr1    3055231    3056997    -
Chr1    28881539    28885023    +

最简单的用法就是只给一个文件作为输入,默认就是从左到右逐个字符的进行比较,

$ sort chr.txt
Chr1    28881539    28885023    +
Chr1    3055231    3056997    -
Chr1    471971    473336    -
Chr3    18709613    18710836    +
Chr3    20251812    20254323    +
Chr3    21701520    21703114    +
Chr5    25645209    25646845    -

默认是从小到大,也可以用-r, --reverse实现从大到小进行排序

$ sort -r chr.txt
Chr5    25645209    25646845    -
Chr3    21701520    21703114    +
Chr3    20251812    20254323    +
Chr3    18709613    18710836    +
Chr1    471971    473336    -
Chr1    3055231    3056997    -
Chr1    28881539    28885023    +

如果你想指定某一列进行排序,需要用到参数-k, --key=KEYDEF, 其中KEYDEF就是你指定的列

$ sort -k2 chr.txt 
Chr3    18709613    18710836    +
Chr3    20251812    20254323    +
Chr3    21701520    21703114    +
Chr5    25645209    25646845    -
Chr1    28881539    28885023    +
Chr1    3055231    3056997    -
Chr1    471971    473336    -

你会发现一个不对劲的情况,为啥28881539会比3055231小?因为默认情况下,sort将数字当做字符处理,从左到右,逐个比较字符,在第一个数字上,2是比3小,因此28881539在前3055231在后。如果你需要按照数值大小进行排序,那么就需要一个额外参数-n,--numeric-sort

$ sort -nk2 chr.txt
Chr1    471971    473336    -
Chr1    3055231    3056997    -
Chr3    18709613    18710836    +
Chr3    20251812    20254323    +
Chr3    21701520    21703114    +
Chr5    25645209    25646845    -
Chr1    28881539    28885023    +

那能不能先根据第一列然后根据第二列排序呢?

$ sort  -k1,1 -k2,2n chr.txt
Chr1    471971    473336    -
Chr1    3055231    3056997    -
Chr1    28881539    28885023    +
Chr3    18709613    18710836    +
Chr3    20251812    20254323    +
Chr3    21701520    21703114    +
Chr5    25645209    25646845    -

你可能对这里面 -k1,1 -k2,2n感觉特别的奇怪,这是因为我还没有说明KEYDEF到底是什么

KEYDEF的定义是 F.C,F[OPTS]]。这里[]就是可填可不填的意思,例如一开始的k2就是只填了第一个F。F表示filed, 也就是列,这里一共有两个F,分别用于排序键值的起始位置列和结束位置列。举个例子

$ sort -k1,2 chr.txt 
Chr1    28881539    28885023    +
Chr1    3055231    3056997    -
Chr1    471971    473336    -
Chr3    18709613    18710836    +
Chr3    20251812    20254323    +
Chr3    21701520    21703114    +
Chr5    25645209    25646845    -

效果就是将第一列和第二列进行合并,然后从左到右进行逐个比较。

.C适用于Chr23Chr2这种字符和数字混合的情况,我们希望Chr2 < Chr23,但是默认是Chr23 > Chr2. .C表示从第C个位置开始,当做数字处理

$ cat test.txt 
Chr1
Chr23
Chr2
$ sort -k1.4 test.txt
Chr1
Chr2
Chr23

最后OPTS表示该列的排序类型,可选项是 [bdfgiMhnRrV], 我比较常用的就是n和r。

那么 -k1,1 -k2,2n就很好理解了, 就是先按照第一列排序,然后按照第二列排序,其中第二列是数值型数据。

除了按数字排序,sort还支持按照月份缩写-M,--month-sort, 例如'JAN'<'DEC', 人类可读数值-h,--human-numeric-sort, 例如 2K < 1G。

如果你的输入内容是 0.04,1,123,1e-10,3.23 这种数字记录类型,sort也提供-g,--general-numeric-sort,对其排序

$ sort numbers.txt 
0.04
1
123
1e-10
3.23
$ sort -g numbers.txt
1e-10
0.04
1
3.23
123

还有一个和软件版本开发相关的排序-V, --version-sort。你是不是觉得1.21 的版本比 1.3新。然而在软件开发领域,1.3 比1.21新

$ sort -V version.txt 
1.3
1.21

其他你可能会用得到的参数

  • -b: 获取开头的空白
  • -f: 忽略大小写
  • --parallel=N: 并行
  • -o, --output=FILE: 指定输出文件,而非标准输出
  • -c, --check: 检查是否排序, 输出第一个排序不对的位置
  • -C, --check=quiet, --check=silent: 检查是否排序,没有任何输出,echo $?返回1
  • -t, --field-separator=SEP: 默认是空格分隔,可以指定分隔符
  • -m,--merge: 合并已经排序的文件
目录
相关文章
|
移动开发 JavaScript 前端开发
白话 uni-app,细说 uni-app 和传统 H5 的区别
白话uni-app 本文适合对象: 已经通过uni-app官网对产品概念有了了解,看过uni-app的官方视频介绍 熟悉h5,但对小程序、vue不了解 传统的h5只有1端,即浏览器。而uni-app可跨7端,虽仍属前端,与传统h5有不同。
12409 0
技术宅之---用手机实现“移动网关”
本文假定读者已知道内网穿透相关认知。 或许你用过花生壳、frp、ngrok、teamviewer等穿透工具,今天要给大家介绍的是smarGate(https://github.com/lazy-luo/smarGate) 1、samrGate是什么? 官方命名为“移动网关”,通过手机客户端将位于内网的服务端网络进行按需暴露。
4284 0
|
3月前
|
人工智能 自然语言处理 API
阿里云百炼DeepSeek-V4-Pro/Flash全量上线:计费标准、折扣政策与场景化应用详解
阿里云百炼平台已正式上线DeepSeek-V4系列模型,对外提供DeepSeek-V4-Pro与DeepSeek-V4-Flash两种规格服务。此次上线保持API定价与模型官方一致,并面向用户提供低至4.5折的专属优惠,百万Tokens输入成本可低至1元,输出成本可低至2元,大幅降低企业与开发者使用高性能大模型的门槛。平台支持按量计费、节省计划、包月包季等多种付费模式,覆盖电商营销、广告创作、短剧内容生产、AI编程、智能客服、智慧办公等主流场景,为不同规模用户提供灵活、高性价比的AI服务方案。
3725 0
|
人工智能 自然语言处理 供应链
AI技术落地方法论--从技术到生态的系统化落地
本文三桥君围绕AI技术落地难题,提出“点线面体”金字塔法则,系统解析从单点技术突破到行业生态构建的演进路径,并探讨技术支撑底座如何助力AI落地全过程。
621 29
|
10月前
|
机器学习/深度学习 人工智能 监控
拔俗AI信息化系统开发指南:从入门到实践
资深产品经理分享AI信息化系统开发全解析:从概念、背景到落地,用通俗语言讲清如何用AI升级传统系统。涵盖需求分析、架构设计、敏捷开发、测试部署及未来趋势,助力企业降本增效,把握数字化时代机遇。(238字)
281 0
|
机器学习/深度学习 人工智能 分布式计算
阿里云机器学习 PAI 年度发布:持续锻造云原生的 AI 工程平台
刚刚结束的 2022 云栖大会上,阿里云机器学习平台 PAI 发布了在开发者服务、企业级能力、工程性能优化三个方向的一系列新特性和功能。从支撑达摩院上云,到服务金融、汽车、互联网、制造等多个行业的创新实践,机器学习 PAI 不断夯实云原生的 AI 工程平台能力。
阿里云机器学习 PAI 年度发布:持续锻造云原生的 AI 工程平台
|
存储 NoSQL 人机交互
【Docker系列】从头学起 Docker——docker --help命令详解
【Docker系列】从头学起 Docker——docker --help命令详解
【Docker系列】从头学起 Docker——docker --help命令详解
|
机器学习/深度学习 编解码 算法
Jetson Nano tensorrt部署YOLOX流程
Jetson Nano tensorrt部署YOLOX流程
1176 0
Jetson Nano tensorrt部署YOLOX流程
|
机器学习/深度学习 人工智能 自然语言处理
如何学习使用AIGC
如何学习使用AIGC