我希望在子目录之间递归删除多个文档中的重复行,但不应将一行视为重复的除非前一行相同,即对于行:
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
答案 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