常用命令: sort学习笔记

2024-06-23 20:38

本文主要是介绍常用命令: sort学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文的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][OPTS][,F][.C][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: 合并已经排序的文件

这篇关于常用命令: sort学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088215

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总