linux sort 自定义分割符多重排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux sort 自定义分割符多重排序相关的知识,希望对你有一定的参考价值。

我有下面一个文件test.1
PM25D7_R1_L1_L3_107-1-2-9.1.fq.gz
PM25D7_R1_L2_L4_107-1-2-9.1.fq.gz
PM25D7_R2_L1_L3_107-1-2-9.2.fq.gz
PM25D7_R2_L2_L4_107-1-2-9.2.fq.gz
PM25D7_single_L1_L3_107-1-2-9.single.fq.gz
PM25D7_single_L2_L4_107-1-2-9.single.fq.gz

用了sort -t '_' -k1 -k3 test.1命令后,怎么第三列不是按L1,L2排序的?

1、sort 用法参数有 -urontk

-u 去重

-r 降序

-o 标准输出

-n 换数字排序

-t 指定分隔符

-k 指定以第列来排序

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

2、所以主要用到了-t 与-k参数

# ls |sort -t "_"  -k 3
PM25D7_R1_L1_L3_107-1-2-9.1.fq.gz
PM25D7_R2_L1_L3_107-1-2-9.2.fq.gz
PM25D7_single_L1_L3_107-1-2-9.single.fq.gz
PM25D7_R1_L2_L4_107-1-2-9.1.fq.gz
PM25D7_R2_L2_L4_107-1-2-9.2.fq.gz
PM25D7_single_L2_L4_107-1-2-9.single.fq.gz
参考技术A 经过多方查找和测试,终于帮你解决了,还是对sort -k参数理解的不透彻的原因,按如下试试吧
sort -t "_" -k 1,1 -k 3 test.1

追问

额,总算可以了,谢谢了啊,能解释一下直接-k1为什么不行,为什么要-k 1,1呢

追答

-k的参数比较多,详细如下,摘自网上,请多理解:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。(F指域field C指字符char )
先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。
Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。
C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

本回答被提问者采纳
参考技术B

sort -t '_' -k3 zz.txt

l1, l2 都在第三列

追问

额好吧,我的错,其实是我想先按第一列排序,接着按第三列,这样就一定要先k1了啊

追答

请接受回答。谢谢~

参考技术C 它是先按第一个区间排序,如果相同再按第三个区间排序,你可以sort -t '_' -k3 test.1这样追问

额,不懂,能不能说清楚点,直接给命令啊,-k1 和-k3应该要一起用的吧

追答

为什么要一起用?你不是按第三个域排序吗?直接-k 3不就完了

追问

上面只是部分数据,第一列的其实还有其他的

追答

先把原理搞清,-k 1 -k 3,首先按第一列排序,然后前面有相同的,再来按第3列排序,你如果一定要先按第三列排序,你可以先写-k 3再写-k 1

追问

是的, 我就是想先按第一列排序,再按第三列排序,实际上,上面那个文件的顺序我就是用-t ‘_' -k1 -k3得到的, -k3没有效果啊

追答

那你直接这样吧:sort -t '_' -k 1.1,1.6 -k 3 test.1

Linux学习笔记(二十五)shell特殊符号 sort_wc_uniqtee_tr_split

一、特殊字符

1.
‘* ‘任意个任意字符
‘? ‘任意一个字符
‘# ‘注释字符
‘ \ ‘脱义字符
‘ | ‘管道符
其中大部分之前都用过,对于脱义符‘\‘
技术分享图片
脱义符用法举例如图

2.几个与管道有关的命令
cut 分割,-d 分隔符 -f 指定段号 -c 指定第几个字符
技术分享图片
技术分享图片
sort 排序, -n 以数字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
sort 1.txt //将1.txt排序
特殊字符最小,数字次之,之后是字母顺序

技术分享图片
sort -n 1.txt //以数字大小排序,特殊字符与英文默认大小为0
技术分享图片
技术分享图片
wc -l 统计行数 -m 统计字符数 -w 统计词
-m包括换行符
-w以空格分隔
技术分享图片
技术分享图片
uniq 去重, -c统计行数
uniq需要先排序再去重,如果不排序,无法去重
技术分享图片
技术分享图片
技术分享图片

tee 和>类似,重定向的同时还在屏幕显示
输出重定向并不会显示内容,tee会在重定向的同时还在屏幕显示
tee -a 追加
技术分享图片
tr 替换字符,tr ‘a‘ ‘b‘,大小写替换tr ‘[a-z]‘ ‘[A-Z]‘
技术分享图片
split 切割,-b大小(默认单位字节),-l行数
find /etc/ -type f -name "*.conf" -exec cat {} >>a.txt \;
技术分享图片
技术分享图片
技术分享图片
技术分享图片
如果不指定名字切割后文件名以x后加字母为名字
技术分享图片
上图中abc 是指定文件名开头
split -l 按行数切割
技术分享图片
技术分享图片
二、特殊符号

$ 变量前缀,!$组合,正则里面表示行尾
 ;多条命令写到一行,用分号分割
 ~ 用户家目录,后面正则表达式表示匹配符
 & 放到命令后面,会把命令丢到后台
 >                   // 正确重定向
  >>               //正确追加重定向
   2>             //错误重定向
     2>>          //错误追加重定向
     &>           //正确错误重定向
 [ ] 指定字符中的一个,[0-9],[a-zA-Z],[abc]
 || 和 && ,用于命令之间

|| 或者

技术分享图片
二选一,前面的命令成功时就不会执行后面的命令
&& 前面的命令成功了才会执行后面的命令
技术分享图片

以上是关于linux sort 自定义分割符多重排序的主要内容,如果未能解决你的问题,请参考以下文章

python之自定义排序函数sorted()

要求编写一自定义函数sort,完成对n个字符串的降序排序?

关于Lucene的自定义Sort排序

sort方法和自定义比较器的写法

Arrays.sort()自定义排序的实现

Python 使用列表的sort()进行多级排序实例演示,list的sort()排序方法使用详解,python3中sort()的cmp自定义排序方法,sort()的逆序倒叙排序方法