对于文本文件进行沟通,是离不开排序的,对于文本处理任务,排序可以起到不小的作用,sort命令可以帮助我们去进行一些排序,而且,搭配使用uniq,可以从文本中uniq去提取出单一的行
sort命令可以从特定的文件,也可以从stdin中获取输入,并且将输出写入stdout,uniq的工作模式和sort一样
我们对如下的一组文件进行排序
sort err.txt out.txt > sorted.txt
cat sorted.txt
或者使用 -o 来进行排序后输出给文件
sort err.txt out.txt -o sorted.txt
找出所有已经排序文件中不重复的行
cat sorted_file.txt | uniq > uniq_lines.txt
常见的一些指令还有
对数字进行排序
sort -n file.txt
对逆序进行排序
sort -r file.txt
对月份进行排序
sort -M months.txt
用下面的方法测试一个文件是否已经排序过了
#! /bin/bash
sort -c file;
if [$? -eq 0] ; then
echo Sorted
else
echo Unsorted;
fi
如果需要合并两个排序过的文件,并且不需要再次排序的文件,可以使用
sort -m sorted1 sorted2
根据键或者列进行排序
将下面的文本进行排序,可以按照列进行
cat data.txt
1 mac 2000
2 winxp 4000
3 basd 1000
4 linux 1000
目前这个按照第一列来进行排序的,我们可以让其根据第二列或者第三列进行排序
sort -k 可以指定排序应该按照哪一个键进行,键指的是列好,列号是执行排序时候的依据,-r告诉sort命令按照逆序来进行排序
比如
sort -k 2 data.txt
按照第二列进行排序
sort时候,对于文字和数字的排序是不一样的,如果非要采用数字顺序来排序,就一定要明确给出-n选项
-k还支持使用特定范围内的一组字符来进行排序
sort -nk 2,3 data.txt
突出显示字符将用作数值键,为了提取这个键,用字符的起止位置作为键的书写格式
sort -nk 1,1 data.txt
将第一个字符作为键
sort -nk 1,1 data.txt
为了让sort的输出以\0作为参数终止符的xargs命令相兼容,采用下面的命令
sort -z data.txt | xargs -0
有必要文本中可能包含的一些像空格之类不必要的字符,如果需要忽略这些字符,并且以字典序进行排序,可以使用
sort -bd unsorted.txt
其中,选项-b 用于忽略文件中的前导空白字符,选项-d用于指明以字典序进行排序
uniq用于消除重复的内容,从给定的输入中找到单一的行,可以用来找到输入中出现的重复行,uniq只能用于排序过的数据输入,所以经常和sort命令结合起来使用
或者是 sort unsorted.txt | uniq
或者是 sort -u unsorted.txt
只显示只出现了一次的行
uniq -u sorted.txt
或者是
sort unsorted.txt | uniq -u
在排序的时候,可以结合-s 和 -w来指定键
-s 指定跳过前N个字符
-w 指定用于比较的最大字符数
我们忽略了前两个字符 -s 2,并且使用 -w 2 选项来比较最大字符数的方式选定该键
uniq -z file.txt
使用uniq生成字符串样式
我们有一个包含重复字符的字符串,我们需要知道每个字符在字符串中出现的次数
输入 ahebhaaa
得到输出
4a1b1e2h
只要有重复,就会有出现的次数
具体的获取方式如下
INPUT=”ahebhaaa”
OUTPUT=`echo $INPUT | sed ‘s/[^\n]/&\n/g’ | sed ‘/^$/d’ | sort | uniq -c | tr -d ‘\n’`
这样就是完成了获取次数
单个命令可以解释为
sed ‘/^$/d’ 最后一个字符被替换为 字符 + \n 因此最后一行多一个空行,于是 sed ‘/^$/d’就是删除这最后一行的
sort 每行只有一个字符,所以可以进行排序,并可以将排序结果作为uniq输入
uniq -c : 这个命令打印出每一行各重复了多少次
tr -d ‘\n’ 将输入中的空格和换行符进行删除,生成所要求的的输出格式