曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3239|回复: 0
打印 上一主题 下一主题

sort -- 对文件内容进行排序

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-3-24 11:06:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sort 命令可以对文件内容进行多种形式排序。

1. 使用 -n 选项按照数字排序
# sort tmp.txt
1
11
3
5
9
# sort -n tmp.txt
1
3
5
9
11

2. 使用 -r 选项按照倒序排序
仍然用第 1 例中的测试文本 tmp.txt:
# sort -nr tmp.txt
11
9
5
3
1

3. 使用 -M 选项按月份排序(Jan, Feb, Dec 等)
测试文本:
# cat tmp.txt
Jan
Oct
Feb
March
May
Dec
运行输出:
# sort -M tmp.txt
Jan
Feb
March
May
Oct
Dec

4. 使用 -C 选项检测该文件是否已经被排序过
下面是一个测试脚本:
[Bash shell] 纯文本查看 复制代码
#!/bin/bash

sort -MC $1

if [ $? -eq 0 ]; then
 echo "Files Sorted"
else
 echo "Files Unsorted"

fi

该脚本用来检测一个文本中的内容是否已经按照 -M 选项的要求来排序过,运行如下:
# cat tmp.txt
Jan
Oct
Feb
March
May
Dec
# cat tmps.txt
Jan
Feb
March
May
Oct
Dec
# ./chksort.sh tmp.txt
Files Unsorted
# ./chksort.sh tmps.txt
Files Sorted

5. 使用 -m 选项合并已经排序过的文件,但不重新再排序
假设两个已经排序过的文件如下:
# cat tmps.txt
Jan
Feb
March
May
Oct
Dec
# cat tmpns.txt
1
3
5
7
9
对这两个文件使用 -m 选项将之合并:
# sort -m tmpns.txt tmps.txt
1
3
5
7
9
Jan
Feb
March
May
Oct
Dec

6. 使用 -k 选项按照指定 key 进行排序
这里的 key 实际上就是列号。下面是测试文本内容:
# cat tmp.txt
windows        3000
macios        5000
ucosii        1000
freebsd        2000
linux        7000
按照第 1 列来排序:
# sort -k 1 tmp.txt
freebsd        2000
linux        7000
macios        5000
ucosii        1000
windows        3000
由上可见,第 1 列按照可每行的第 1 个字母的顺序来排列。如果指定 -k 2 那么就是按照第 2 列来排序,第 2 列是数字形式,因此最好加个 -n 选项,不加也可以:
# sort -nk 2 tmp.txt
ucosii        1000
freebsd        2000
windows        3000
macios        5000
linux        7000

上面,-k 指定的 key 号默认是文本内容的列号,但有时我们需要在根据一行中的某部分内容进行排序,这时候需要给出一个排序范围依据。如下面的测试文本:
# cat tmp.txt
133232welcome
839231hello
1081318groad
8401831net
按照指定范围来排序:
# sort -nk 2,3 tmp.txt
1081318groad
133232welcome
839231hello
8401831net

# sort -nk 2,4 tmp.txt
1081318groad
133232welcome
839231hello
8401831net

7. 使用 -u 选项进行唯一性排列(uniq)测试文本内容:
# cat temp.txt
hello
anono
groad
hello
使用 -u 选项排序上面的文本:
# sort -u temp.txt
anono
groad
hello

8. 使用 -t 选项指定分隔符:
[beyes@groad.net ~]$ sort -n -t: -k3 /etc/passwd | less
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
... ...
这里,-t 选项指出了每行的分隔符为一个冒号,且 -k 选项指出了这是分隔后的第 3 个域。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 08:42 , Processed in 0.083570 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表