014.sort、uniq

文章介绍了sort命令的排序功能,包括数字、月份、逆序排序以及uniq命令用于去重,强调了sort和uniq配合使用的重要性。还讨论了如何检查文件排序状态、依据列排序以及uniq选项如-s、-w和-z的应用。
摘要由CSDN通过智能技术生成

对文本文件进行排序是一项常见的任务。sort命令能够对文本文件和stdin进行排序。它可以配合其他命令来生成所需要的输出。uniq经常与sort一同使用,提取不重复(或重复)的行。sort和uniq命令可以从特定的文件或stdin中获取输入,并将输出写入stdout。

1、Sort
a. sort 命令
  • 描述:行排序
  • 语法:sort [选项] 文件

-n 按数字的方式排序

-t: 指定分隔符,默认分隔符是制表符;

-k [n,m]:指定字段范围排序。从第 n 个字开始,到第 m 个字(默认到行尾)

-u: 删除重复行。就是 uniq 命令;

-r 按照逆序排序

-M 按照月份排序

-m 合并已排序的文件

# 按默认方式(ASCII)排序并输出到 排序文件
sort file1.txt file2.txt > sorted.txt

#  按照数字顺序排序
sort -n file1.txt

#  按照数字反向顺序排序
sort -nr file1.txt

# 按照月份排序
sort -M months.txt

检查文件是否已排序:

#!/bin/bash
# 功能描述:排序

sort -C filename;
if [ $? -eq 0 ];then
	echo Sorted;
else
	echo Unsorted;
fi
  • 将filename替换成你需要检查的文件名,然后运行该脚本。
  • 如果文件已经排序,sort会返回为0的退出码($?),否则返回非0。
b. 依据键或列排序

有很多方法可以对这段文本排序。目前它是按照序号(第一列)来排序的。我们也可以依据第二列和第三列来排序。

-k指定了排序所依据的字符。如果是单个数字,则指的是列号。-r告诉sort命令按照逆序进行排序。

# 依据第1列,以逆序形式排序
sort -nrk 1 data.txt

 # 依据第2列进行排序
 sort -k 2 data.txt

一定要留意用于按数字顺序进行排序的选项-n。sort命令对于字母表排序和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,就应该明确地给出-n选项。

-k后的整数指定了文本文件中的某一列。列与列之间由空格分隔。如果需要将特定范围内的一组字符(例如,第2列中的第4~5个字符)作为键,应该使用由点号分隔的两个整数来定义一个字符位置,然后将该范围内的第一个字符和最后一个字符用逗号连接起来:

 # 按照m、p、t的顺序排序
  sort -bk 2.3,2.4 data.txt

把作为排序依据的字符写成数值键。为了提取出这些字符,用其在行内的起止位置作为键的书写格式(在上面的例子中,起止位置是2和3)。

# 用第一个字符作为键:
sort -nk 1,1 data.txt

为了使sort的输出与以\0作为终止符的xargs命令相兼容,采用下面的命令:

# 终止符\0用来确保安全地使用xargs命令
sort -z data.txt | xargs -0

有时文本中可能会包含一些像空格之类的多余字符。如果需要忽略标点符号并以字典序排序,可以使用:

 sort -bd unsorted.txt
  • 其中,选项-b用于忽略文件中的前导空白行,选项-d用于指明以字典序进行排序。

2、Uniq
a. uniq 命令
  • 描述:对排序文件去重
  • 语法:uniq [选项] 文件

-s 指定跳过前N个字符;

-w 指定用于比较的最大字符数。

uniq命令可以从给定输入中(stdin或命令行参数指定的文件)找出唯一的行,报告或删除那些重复的行。

uniq只能作用于排过序的数据,因此,uniq通常都与sort命令结合使用。

#
sort unsorted.txt | uniq

# 只显示唯一的行(在输入文件中没有重复出现过的行)
sort unsorted.txt | uniq -u

# 统计各行在文件中出现的次数
sort unsorted.txt | uniq -c

# 找出文件中重复的行
sort unsorted.txt  | uniq -d

这个对比键可以作为uniq操作时的索引:

为了只测试指定的字符(忽略前两个字符,使用接下来的两个字符),我们使用-s 2跳过前两个字符,使用-w 2选项指定后续的两个字符:

sort data.txt | uniq -s 2 -w 2

我们将命令输出作为xargs命令的输入时,最好为输出的各行添加一个0值字节(zero-byte)终止符。使用uniq命令的输入作为xargs的数据源时,同样应当如此。如果没有使用0值字节终止符,那么在默认情况下,xargs命令会用空格来分割参数。例如,来自stdin的文本行“this is a line”会被xargs视为4个不同的参数。如果使用0值字节终止符,那么\0就被作为定界符,此时,包含空格的行就能够被正确地解析为单个参数。

# -z选项可以生成由0值字节终止的输出:
$ uniq -z file.txt	

# 删除所有指定的文件,这些文件的名字是从files.txt中读取的:
uniq -z file.txt | xargs -0 rm

如果某个文件名出现多次,uniq命令只会将这个文件名写入stdout一次,这样就可以避免出现rm:cannot remove FILENAME: No such file or directory。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值