对于文本文件进行沟通,是离不开排序的,对于文本处理任务,排序可以起到不小的作用,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’ 将输入中的空格和换行符进行删除,生成所要求的的输出格式

发表评论

邮箱地址不会被公开。 必填项已用*标注