使用sed批量删除重复行

时间:2013-03-27 20:30:47

标签: batch-file sed

我正在努力清理Windows机器上的几百个文件,我需要做的一件事就是删除一些重复的行。因此,示例文件可能如下所示:

foo=false    
bar=true
baz=false
baz=false
baz=false

因此,在使用sed时,我遇到this site,其中展示了一条删除重复行的行。

sed "$!N; /^\(.*\)\n\1$/!P; D" textfile.txt

所以我把它插入命令窗口,查看它是否有效,控制台窗口显示删除了重复的行。之后,我将该行插入我的批处理脚本,以便根据需要编辑的文件列表运行它。

FOR /F %%a IN ('listfile.txt') DO (
  sed "$!N; /^\(.*\)\n\1$/!P; D" %%a
)

但是当我针对我的文件测试列表运行它时,它删除了文件中的每一行,除了一个重复的行。

我不熟悉sed足以确定线路正在做什么,但我对它的测试表明它正在做我想做的事情。什么给出了什么?我错过了sed在批处理文件中工作的方式吗?


根据我尝试的评论:

gawk "!a[$0]++" textfile.txt

再次在命令行上运行,但在脚本中不运行。因此,批处理文件运行此命令的方式肯定存在一些问题,但我无法弄清楚它是什么。

2 个答案:

答案 0 :(得分:1)

在Windows平台上,使用PowerShell很简单:

get-content "textfile.txt" | sort-object -unique

比尔

答案 1 :(得分:1)

在对原始sed语句进行更多测试后,我发现它已挂在命令中的!上。所以我开始沿着这条路线进行挖掘,发现EnableDelyedExpansion导致!,即使在sed语句中,也会删除它们之间的所有内容。

所以我的选择是逃避!或缩小EnableDelayedExpansion的范围。由于转义似乎没有起作用,我只是将范围缩小到需要它的特定变量的右边,然后sed语句似乎在此之后正常工作。