1

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

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

因此,在与我合作时,sed我遇到了这个网站,该网站展示了一条删除重复行的行。

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

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

4

2 回答 2

1

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

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

账单

于 2013-03-27T21:12:22.067 回答
1

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

所以我的选择是逃避!或缩小EnableDelayedExpansion. 由于转义似乎不起作用,我只是将范围缩小到需要它的特定变量周围,然后该sed语句似乎可以正常工作。

于 2013-03-28T15:37:36.623 回答