个人笔记(linux/sort与uniq命令)
sort
命令(排序)
功能:行排序
核心语法:
sort [选项] [文件]
常用选项:
选项 | 作用 | 示例 |
---|---|---|
-n | 数值排序 | sort -n |
-r | 降序排序 | sort -nr |
-k | 指定排序列 | sort -k2,2n |
-t | 指定分隔符 | sort -t':' -k3n |
-u | 去重(相当于 uniq ) | sort -u |
典型用法:
# 按第二列数字降序排序
sort -k2,2nr data.txt# 处理CSV文件(以逗号分隔)
sort -t',' -k3n data.csv
注意事项:
默认按字典序排序(字母顺序,10会排在2前面)
处理中文需设置
LC_ALL=C
避免编码问题
3. uniq
命令(去重统计)
功能:报告或过滤重复行
核心语法:
uniq [选项] [输入文件]
关键选项:
选项 | 作用 | 示例 |
---|---|---|
-c | 统计出现次数 | uniq -c |
-d | 只显示重复行 | uniq -d |
-u | 只显示唯一行 | uniq -u |
必须前置条件:
# 必须先排序!
sort file.txt | uniq -c
示例:
# 统计单词频率(错误示范)
echo -e "apple\norange\napple" | uniq -c # 错误!输出:
# 1 apple
# 1 orange
# 1 apple# 正确做法
echo -e "apple\norange\napple" | sort | uniq -c
# 输出:
# 2 apple
# 1 orange
4. 组合排序技巧
复杂排序场景:
# 按第二列数字降序,第三列字母升序
sort -k2,2nr -k3,3 data.txt# 处理带标题行的CSV(跳过第1行)
( head -1 data.csv; tail -n +2 data.csv | sort -t',' -k4n )
性能优化:
# 设置本地化加速排序(处理ASCII文本)
LC_ALL=C sort file.txt
补充:
单个sort时排序方式默认按字典序排序
📌 排序规则(字母序 / 字典序)
在字母序(Lexicographical Order)下,字符串按 从左到右逐字符比较 ASCII 码 排序。规则如下:
比较第一个字符,ASCII 码小的排前面(如
'a'
<'b'
)。如果第一个字符相同,比较第二个字符,以此类推。
如果所有字符都相同,较短的字符串排前面(如
"abc"
<"abcd"
)。字母序是逐字符比较 ASCII 码,不是按字母表顺序(但通常结果类似)。
短字符串优先(如果前面字符相同,如
"abc"
<"abcd"
)。大写字母排在小写字母前面(如
"A"
<"a"
),但你的例子全是小写,不影响。数字字符的 ASCII 码 < 大写字母 < 小写字母(如
'0'
=48,'A'
=65,'a'
=97)。例子:words.txt数据
apple Banana cat applepie 123 42 Zebra apple
运行代码
sort words.txt
输出:
123 42 Banana Zebra apple apple applepie cat
text
dffgbf nfdlvn sdfgh sedgg wedfg wer xcef xcvvaf
📌 验证(用
sort
命令)echo -e "sdfgh\nsedgg\nwer\nwedfg\nxcef\nxcvvaf\ndffgbf\nnfdlvn" | sort
输出:
dffgbf nfdlvn sdfgh sedgg wedfg wer xcef xcvvaf