曲径通幽论坛

标题: sort -- 对文件内容进行排序 [打印本页]

作者: beyes    时间: 2012-3-24 11:06
标题: sort -- 对文件内容进行排序
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 个域。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2