我正在使用 git bash,所以我想在 Unix 论坛提问是可以的,但我不熟悉 Unix,只会使用ls
、find
和grep
,所以如果我错了,请纠正我。
我有数百个.csv
文件,每个文件可能有数百行。现在我想删除空的 csv 行-- 空的 csv 行不是指只有空格的行,而是指全是逗号 ( ,,,
) 的行。
例如,csv 文件的内容为
Header2,Header3,Header5,Header7
a,b,c,d
,,,
aa,bb,cc,dd
,,,
,,,
aaa,bbb,ccc,ddd
,,,
,,,
,,,
,文件中有数百行,我想将其更新为
Header2,Header3,Header5,Header7
a,b,c,d
aa,bb,cc,dd
aaa,bbb,ccc,ddd
并且有数百个这样的文件,请注意并非所有的 csv 文件都需要更新,目前我正在使用 vim 编辑器的vimgrep RegExPattern folders
命令,它通过正则表达式模式扫描其内容来过滤出目标 csv 文件,例如/,Header5,/
仅过滤出带有 的 csv 文件Header5
;然后我将使用cdo g/RegExPattern/d | update | edit #
可以对每个命中文件运行正则表达式替换的命令,例如在这里我使用cdo g/\v^,*$/d
仅带有逗号的行来删除行。
但是,Vim 会替换并记录每一行删除的操作,因为一个文件中可能有数百个匹配项,并且有数百个 .csv 文件,所以速度非常慢。
有没有办法在 Unix 中实现这个任务?
但并非万无一失,因为可能存在如下文件:
其中
,,,
假阳性和"","","",""
假阴性是什么。但是您可以删除不包含除以下字符之外的行
,
:Where
grep
查找至少有一行不包含 以外字符的文件,
,xargs
将结果传递给sed
并sed
对其进行编辑,i
以删除除 以外字符的行以外的行,
。虽然
grep
、xargs
、sed
是 Unix 命令,但这里我们使用非标准 GNU 扩展(-r
、-Z
、--include
、i
;-r
-0
刚刚被添加到 的 POSIX 规范中xargs
)。假设所有 .csv 文件都在当前目录中。进一步假设目标“空”行始终是多个逗号,中间没有任何内容。然后,您可以使用类似下面的方法从所有这些文件中删除“空”行: