方法一,使用uniq相关命令进行去重
用法:uniq [选项]... [输入文件 [输出文件]] 从 <输入文件>(或标准输入)中过滤内容相同的相邻的行, 并写到 <输出文件>(或标准输出)。 不带选项时,内容相同的行将仅输出一次。 长选项的必选参数对于短选项也是必选的。 -c, --count 在每行之前加上该行的重复次数作为前缀 -d, --repeated 只输出重复的行,每组重复的行输出一次 -D 输出所有重复的行 --all-repeated[=方法] 类似 -D,但支持在每组重复的行之间添加一行空行; 方法={none(默认),prepend,separate} -f, --skip-fields=N 不要比较前 N 个字段 --group[=方法] 分组输出所有项目,每组之间用空行分隔; 方法={separate(默认),prepend,append,both} -i, --ignore-case 比较时忽略大小写 -s, --skip-chars=N 不要比较前 N 个字符 -u, --unique 只输出不重复(内容唯一)的行 -z, --zero-terminated 以 NUL 空字符而非换行符作为行分隔符 -w, --check-chars=N 每行最多比较 N 个字符 --help 显示此帮助信息并退出 --version 显示版本信息并退出 字段指的是空白字符(通常是空格和/或制表符)的序列,后跟非空白字符的序列。 程序将先跳过字段 (--skip-fields),后跳过字符 (--skip-chars)。
需要注意的是:重复的行必须是相邻的,否则 "uniq" 将无法检测到它们,所以使用uniq进行去重时需要先进行排序。 另外,使用 sort -u也可以达到排序并去重的目的标签:文件,输出,--,skip,value,重复,linux,排序 From: https://www.cnblogs.com/caicai2019/p/18052505
方法二、使用awk加判断命令进行去重
awk '!x[$0]++' file #注意awk后跟的命令是单引号,而非双引号,否则会认为是字符串
上面的意思是
首先创建一个 map 叫x
,然后用当前行的全文$0
作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。由于表达式之后有++
,因此如果某个 key 找不到对应的 value,该++
操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了
简单来讲:
awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行
参考原文Linux删除重复行 排序和不排序的做法_tcl语言 去重但是不排序-CSDN博客