如果副本直接在同一行之前,如何删除重复行

时间:2016-02-25 11:42:23

标签: bash awk duplicates

我希望在子目录之间递归删除多个文档中的重复行,但不应将一行视为重复的除非前一行相同,即对于行:

foo
foo
foo
bar
baz
foo
bar

结果应为:

foo
bar
baz
foo
bar

我使用awk的原始解决方案失败,因为seen不是解决此问题的正确方法。

#!/usr/bin/env bash

shopt -s globstar
for file in **/*.md; do
    awk '!seen[$0]++' "$file" > "temp" && mv "temp" "$file"
done

2 个答案:

答案 0 :(得分:4)

这是uniq的作用:

uniq file

对于您的输入,它会产生:

foo
bar
baz
foo
bar

来自man uniq

  

报告或过滤掉文件中的重复行。

     

读取比较相邻行的标准输入,并写入   标准输出的每个唯一输入行。

     

相同相邻输入线的第二个和后续副本是   没写。

答案 1 :(得分:1)

uniq solution posted by @fedorqui当然有用。

但是,如果您正在寻找awk解决方案,请使用:

awk '$0 != p; {p = $0}' file
foo
bar
baz
foo
bar