![从文件中删除重复的相邻行](https://linux22.com/image/153490/%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E7%9A%84%E7%9B%B8%E9%82%BB%E8%A1%8C.png)
假设我们有这样的文件:
foo1
bar
foo2
foo2
bar
bar
bar
foo3
我希望它减少为:
foo1
bar
foo2
bar
foo3
基本上只有在相邻的情况下才会删除重复项...我开始编写一个 bash 函数,但意识到我不知道如何做到这一点:
remove_duplicate_adjacent_lines(){
prev='';
while read line; do
if test "$line" != "$prev"; then
prev="$line";
echo "$line"
fi
done;
}
但问题是prev
不在 while 循环的范围内 - 有没有办法用 bash 以某种方式做到这一点?
答案1
这正是该uniq
实用程序的用途:
$ uniq <File
foo1
bar
foo2
bar
foo3
bash 历史记录就是一个很好的例子:
history | uniq
由于行号的原因,上面的代码不起作用,但这会:
cat ~/.bash_history | uniq
将删除重复的相邻命令
从man uniq
:
筛选相邻的匹配线从 INPUT(或标准输入)写入 OUTPUT(或标准输出)。如果没有选项,匹配的行将合并到第一次出现的位置。 [已添加强调]