如何在重定向到文件之前删除重复的条目

如何在重定向到文件之前删除重复的条目

我曾见过命令“uniq”来删除文件中的重复条目,但我的目的是在保存文件之前删除重复的输出

#!/bin/sh
echo "aaa"
echo "bbb"
echo "aaa"
echo "aaa"
echo "bbb"
echo "ccc"

我想要的输出是

aaa
bbb
ccc

然后重定向到文本文件

这样可以吗?谢谢。

答案1

uniq仅适用于排序输入。

./my_script.sh | sort -u > output_file

本质上是一样的

./my_script.sh | sort | uniq > output_file

答案2

awk '!a[$0]++'是一种删除未排序的重复行并保持原始顺序的紧凑方法。

使用这个我们可以例如:

  • 过滤输出:./my_script |awk '!a[$0]++' > output
  • 过滤脚本:awk '!a[$0]++' my_script > new_script
  • 过滤并执行脚本:awk '!a[$0]++' my_script | sh > output
  • vim 内的过滤器::%!awk '\!a[$0]++'

这背后的想法是通过将出现次数存储在数组中来跟踪已经找到的模式,并且仅在该行的特定内容a的值(由in表示)仍然为零时才打印该行。所以,a$0awk

  • a[$0]++$0将“索引” (= 当前输入行的内容)的数组条目增加1
  • !a[$0]是一个过滤规则,指示awk仅在内容的数组条目仍为零时才打印一行(未初始化时隐式出现这种情况)
  • !a[$0]++将两者结合在一行(又名“代码高尔夫”)

...我们还可以使用 bash 使其更具可读性alias

alias myuniq='awk '\''!a[$0]++'\'


\谢谢{@AdminBee}

相关内容