最直接方法是awk '!seen[$0]++' file,利用关联数组以整行为键自动去重,只输出首次出现的行,保持原始顺序且兼容空行。

用 awk 去重整行最直接的方法是利用关联数组记录已出现的行,只输出首次遇到的行。
用数组键值去重(推荐)
核心思路:把整行当作数组下标,借助 awk 数组自动去重的特性,只打印第一次出现的行。
-
awk '!seen[$0]++' file—— 最常用、最简洁的写法 -
seen[$0]初始为 0(false),!取反为 true,所以第一行满足条件被打印 -
++是后置自增,执行完判断再加 1;下次再遇到相同行时,seen[$0]已为非零,取反为 false,跳过
保持原始顺序且区分空行
上述命令默认保留首次出现的顺序,也天然兼容空行(空行也是有效字符串,<p>上述命令默认保留首次出现的顺序,也天然兼容空行(空行也是有效字符串,<code>$0 就是空串)。
- 如果想显式跳过空行,可加条件:
awk 'NF && !seen[$0]++' file -
NF表示字段数,非空行才为真,这样空行不参与去重也不输出
处理带前后空格的“逻辑重复”行
若两行仅因首尾空格不同而被视为不同(如 "abc" 和 " abc "),需先标准化:
awk '{gsub(/^[[:space:]]+|[[:space:]]+$/, ""); if (!seen[$0]++) print}' file-
gsub去掉行首尾空白,再基于清洗后的字符串去重 - 也可用
$1=$1触发字段重解析(自动压缩内部多空格、去掉首尾空格),更简洁:awk '{$1=$1; !seen[$0]++}' file
与 sort -u 的区别和适用场景
sort -u 也能去重,但会改变原始顺序;awk 方案不排序,严格按首次出现位置保留。
- 要保持原始顺序 → 选
awk '!seen[$0]++' - 数据量极大且内存受限 →
sort -u更稳(awk数组全存在内存里) - 需要同时去重+排序 → 直接
sort -u更合适











