答案:在Linux中使用uniq命令去重需先排序处理非相邻重复行,核心方法是结合sort与uniq实现全局去重。通过sort将相同行聚拢,再用uniq去除相邻重复,配合-c、-d、-u、-i等选项可实现统计、筛选重复或唯一行,使用-f、-s可跳过字段或字符进行部分比较,大规模数据时可通过优化sort参数或改用awk、Python等工具提升性能。

在Linux中对数据进行去重,尤其是处理相邻重复行,
uniq
uniq
uniq
sort
要处理Linux中的数据去重,特别是利用
uniq
apple banana apple cherry banana
直接对它运行
uniq
apple
banana
sort
uniq
基本用法:
移除相邻重复行:
cat your_file.txt | uniq
或者直接
uniq your_file.txt
这只会移除紧邻的重复行。
移除所有重复行(包括非相邻的):
sort your_file.txt | uniq
这是最常见的全面去重组合。
sort
uniq
uniq
-c
sort your_file.txt | uniq -c
-d
sort your_file.txt | uniq -d
-u
sort your_file.txt | uniq -u
-i
sort -f your_file.txt | uniq -i
注意,
sort
-f
-f N
# 假设文件内容是 "ID Name" # 101 apple # 102 banana # 101 apple sort -k 2,2 your_file.txt | uniq -f 1 # 这会根据第二个字段(Name)去重,忽略第一个字段(ID)
-s N
# 假设文件内容是 "PREFIX_data1" 和 "PREFIX_data1" # 如果只想比较 "data1",可以跳过 "PREFIX_" 的长度 sort your_file.txt | uniq -s 7
这些选项的组合使用能让你在去重时拥有极高的灵活性和精确度。
uniq
这其实是个很经典的误区,或者说,是
uniq
uniq
foo bar foo baz
uniq
foo
bar
foo
bar
foo
bar
foo
我的经验是,要应对非相邻重复,你几乎总是需要
sort
sort
sort
bar baz foo foo
这时候,
uniq
foo
foo
foo
bar baz foo
应对策略和一些注意事项:
sort | uniq
cat my_data.log | sort | uniq > deduped_data.log
sort
sort
sort -T /tmp
/tmp
sort -S 50%
sort -k
uniq -f
uniq -s
# 假设文件是 "ID,Name" # 1,Apple # 2,Banana # 1,Apple sort -t',' -k2,2 my_csv.txt | uniq -f 1 -s 1 # -s 1 是为了跳过逗号
这里
-t','
-k2,2
uniq -f 1
uniq -s 1
awk
理解
uniq
sort
uniq
uniq
当我们说
uniq
统计与识别:uniq -c
uniq -d
uniq -u
uniq -c
# 统计访问日志中每个IP出现的次数
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nrsort -nr
uniq -d
-d
# 找出文件中所有重复的行(每种重复只显示一次) sort your_file.txt | uniq -d
uniq -u
-u
# 找出文件中所有只出现过一次的行 sort your_file.txt | uniq -u
这个在数据清洗中很有用,比如找出某个列表里真正的“独苗”。
忽略细节:uniq -i
-i
uniq
# 忽略大小写去重 sort -f your_list.txt | uniq -i
注意,为了让
uniq -i
sort -f
sort --ignore-case
部分比较:uniq -f N
uniq -s N
uniq
uniq -f N
N
# 假设文件内容是: # 2023-01-01 user1 login_success # 2023-01-01 user2 login_fail # 2023-01-02 user1 login_success # 如果我们只想根据“user”和“login_status”去重,忽略日期 # 先按user和status排序,然后跳过第一个字段(日期) cat log.txt | sort -k2,2 -k3,3 | uniq -f 1
这里
sort -k2,2 -k3,3
uniq -f 1
uniq
uniq -s N
N
# 假设文件内容: # MSG_ERROR: Disk full # MSG_INFO: System started # MSG_ERROR: Disk full # 如果我们只想根据冒号后的内容去重 sort messages.log | uniq -s 11 # 跳过 "MSG_ERROR: " 或 "MSG_INFO: "
这里
11
这些高级选项的组合使用,能够让你在面对各种去重场景时,都能找到一个优雅且高效的解决方案。有时候,你可能还需要配合
cut
awk
uniq
uniq
处理大规模数据时,任何命令行工具都可能遇到性能瓶颈,
uniq
uniq
sort
sort
uniq
sort
sort
sort
LANG
LC_ALL
sort | uniq
替代方案和优化策略:
对于大规模数据去重,我们通常会考虑以下几种策略:
优化 sort
sort -T /path/to/fast/disk
/tmp
sort -S 50%
sort -S 4G
sort
sort
使用 awk
awk
awk '!a[$0]++' your_large_file.txt > deduped_with_awk.txt
这个
awk
a
a[$0]++
!a[$0]++
a[$0]
awk
a[$0]
awk
awk
awk
sort | uniq
使用 perl
python
awk
perl
python
awk
seen = set()
with open('your_large_file.txt', 'r') as infile, \
open('deduped_with_python.txt', 'w') as outfile:
for line in infile:
if line not in seen:
outfile.write(line)
seen.add(line)这与
awk
set
set
set
分布式处理框架: 对于真正意义上的“海量数据”(TB级别以上),单机工具的局限性就显现出来了。这时,你需要考虑使用分布式处理框架,如 Apache Hadoop (MapReduce) 或 Apache Spark。这些框架天生就是为处理大规模数据集而设计的,它们可以将数据分布到集群中的多台机器上进行并行排序和去重。
(line, 1)
distinct()
groupByKey().mapValues(lambda x: 1)
总的来说,对于日常的大部分去重任务,
sort | uniq
sort
awk
以上就是如何在Linux中去重数据 Linux uniq相邻行处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号