过滤文本文件以删除空行的好方法是什么?

过滤文本文件以删除空行的好方法是什么?

我有一个 .csv 文件(在 Mac 上),其中有一堆空行,例如:

"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum 

lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum 

lorem ipsum ","2","3","4"

我想将其转换为:

"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum  lorem ipsum ","2","3","4"

我知道一定有一个衬垫,但我不知道 awk 或 sed。任何提示都非常感谢!

答案1

您可以使用 grep 的-v(反向匹配)模式来执行此操作:

grep -v '^$' old-file.csv > new-file.csv

请注意,由于 shell 重定向的工作方式,这些文件需要是不同的文件。输出文件在读取输入文件之前打开(并清空)。如果您有 moreutils(Mac OS X 上默认没有),您可以使用sponge以下方法来解决此问题:

grep -v '^$' file.csv | sponge file.csv

但当然,如果出现问题,你就很难再回去了。

如果你的“空行”实际上可能包含空格(听起来确实如此),那么你可以使用它:

egrep -v '^[[:space:]]*$' old-file.csv > new-file.csv

这将忽略空白行以及仅包含空格的行。您当然可以sponge对其进行相同的转换。

答案2

最简单的选择就是grep ..这里,点的意思是“匹配任何东西”,所以如果该行为空,则不匹配。否则它会按原样打印整行。

答案3

要删除空行,到位,使用 ksh93:

sed '/./!d' file 1<>; file

重定向<>;运算符是 ksh93 特有的,与标准运算符相同,<>只是 ksh 在命令终止后截断文件。

sed '/./!d'是一种复杂的编写方式grep .,但不幸的是,如果它的标准输出指向与其标准输入相同的文件,GNU grep 至少会抱怨。你可能会说可以写:

grep . file | cat 1<>; file

但不幸的是,ksh93(至少是我的版本(93u+))中有一个错误,在这种情况下文件似乎被截断为零长度。

grep . file | { cat; } 1<>; file

似乎解决了这个错误,但现在,它比 sed 命令复杂得多。

答案4

根据对您的问题的评论中的澄清,例如:

awk -v RS= -v ORS= 1

可能会做你想做的事。

一个空的记录分隔符是一种特殊情况,它告诉awk记录是段落(由空行序列分隔)。设置输出记录分隔符空字符串也意味着这些段落的内容(不带分隔符)将被连接起来。1只是一个真的打印每条记录的条件。

然而,这会省略尾随的换行符,所以你可以这样做:

awk -v RS= -v ORS= '1;END{if (NR) printf "\n"}'

相关内容