方法一、使用awk加判断命令进行去重
awk '!x[$0]++' file #注意awk后跟的命令是单引号,而非双引号,否则会认为是字符串
上面的意思是
首先创建一个 map 叫 x
然后用当前行的全文 $0 作为 map 的 key,到 map 中查找相应的 value
如果没找到,则整个表达式的值为真,可以执行之后的语句
如果找到了,则表达式的值为假,跳过这一行
由于表达式之后有 ++,因此如果某个 key 找不到对应的 value,该 ++ 操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了
简单来讲:
awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行

方法二,使用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也可以达到排序并去重的目的
posted on 2024-03-04 19:44  caicai2019  阅读(270)  评论(0编辑  收藏  举报