You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Shell脚本去重:除sort -u外的方法及脚本优化需求

保留原有顺序的Shell文件去重方法

先纠正你原脚本里的两个小错误:

  • read命令中变量名不需要加$,正确写法是 read -p "Enter any file name to remove duplicate line:" fname
  • mv命令不需要重定向符号,正确写法是 mv tmp.txt $fname

以下是几种不打乱原有行顺序的去重方法:

方法1:awk实现(最常用高效)

awk通过关联数组记录已出现的行,只输出首次出现的内容,完美保留原顺序:

#!/bin/bash
read -p "Enter any file name to remove duplicate line:" fname
awk '!seen[$0]++' "$fname" > tmp.txt && mv tmp.txt "$fname"

原理:seen[$0]用每行内容作为数组键,首次遇到某行时!seen[$0]为真,执行输出后自增标记;后续再遇到同一行时条件为假,跳过输出。

方法2:纯Bash内置循环实现

用Bash关联数组记录已出现的行,逐行处理,无需依赖外部工具:

#!/bin/bash
read -p "Enter any file name to remove duplicate line:" fname

declare -A seen
while IFS= read -r line; do
    if [[ -z ${seen["$line"]} ]]; then
        echo "$line"
        seen["$line"]=1
    fi
done < "$fname" > tmp.txt && mv tmp.txt "$fname"

原理:IFS= read -r line确保读取含空格、制表符的行时不丢失格式;关联数组seen标记已出现的行,未标记过的行才输出。

方法3:sed实现(适合简单场景)

sed结合保持空间记录已出现的行,写法稍复杂但无需额外工具:

#!/bin/bash
read -p "Enter any file name to remove duplicate line:" fname
sed -n 'G; s/\n/&&/; /^\([^\n]*\n\).*\1/d; s/\n//; h; p' "$fname" > tmp.txt && mv tmp.txt "$fname"

原理:通过h把当前行存入保持空间,G追加保持空间内容到模式空间,检查是否存在重复行,无重复则输出当前行。

内容的提问来源于stack exchange,提问作者Reyan Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:25:33