53

I need to remove all the blank lines from an input file and write into an output file. Here is my data as below.

11216,33,1032747,64310,1,0,0,1.878,0,0,0,1,1,1.087,5,1,1,18-JAN-13,000603221321

11216,33,1033196,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,059762153003

11216,33,1033246,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,000603211032

11216,33,1033280,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,055111034001

11216,33,1033287,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000378689701

11216,33,1033358,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000093737301

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041926

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041954

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049326

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049383

11216,33,1036985,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000093415580

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781202001

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781261305

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781603955

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781615746
4

8 回答 8

96
sed -i '/^$/d' foo

这告诉sed删除匹配正则表达式的每一行,^$即每一个空行。该-i标志会就地编辑文件,如果您sed不支持您可以将输出写入临时文件并替换原始文件:

sed '/^$/d' foo > foo.tmp
mv foo.tmp foo

如果您还想删除仅包含空格的行(而不仅仅是空行),请使用:

sed -i '/^[[:space:]]*$/d' foo

编辑:还要删除行尾的空格,因为显然您已经决定也需要它:

sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo
于 2013-01-28T20:25:42.650 回答
44
awk 'NF' filename

awk 'NF > 0' filename

sed -i '/^$/d' filename

awk '!/^$/' filename

awk '/./' filename

NF 还会删除仅包含空格或制表符的行,而正则表达式/^$/不会。

于 2013-05-02T05:56:40.620 回答
17

Use grep to match any line that has nothing between the start anchor (^) and the end anchor ($):

grep -v '^$' infile.txt > outfile.txt

If you want to remove lines with only whitespace, you can still use grep. I am using Perl regular expressions in this example, but here are other ways:

grep -P -v '^\s*$' infile.txt > outfile.txt

or, without Perl regular expressions:

grep -v '^[[:space:]]*$' infile.txt > outfile.txt
于 2013-01-28T20:21:37.460 回答
12
sed -e '/^ *$/d' input > output

删除所有仅包含空白(或完全为空)的行。您可以将空白更改为选项卡表示的[ \t]位置。\t无论您的 shell 还是您sed将进行扩展,都各不相同,但您可能可以直接键入制表符。如果您使用的是 GNU 或 BSD sed,您可以选择就地进行编辑(如果这是您想要的)-i


如果我执行上述命令,我的输出文件中仍然有空行。可能是什么原因?

可能有几个原因。可能是您没有空行,但行尾有很多空格,所以当您将文件放到屏幕上时,看起来好像有空行。如果这是问题所在,那么:

sed -e 's/  *$//' -e '/^ *$/d' input > output

新的正则表达式删除了行尾的重复空格;有关空白或制表符,请参见先前的讨论。

另一种可能性是您的数据文件来自 Windows 并且具有 CRLF 行结尾。Unix 在行尾看到回车;它不是空白,因此不会删除该行。有多种方法可以解决这个问题。一个可靠的方法是tr删除 ( -d) 八进制 15 字符代码,也就是 control-M 或\r回车:

tr -d '\015' < input | sed -e 's/  *$//' -e '/^ *$/d' > output

如果这些都不起作用,那么您需要显示od -c文件前两行的十六进制转储或八进制转储(),这样我们就可以看到我们面临的问题:

head -n 2 input | od -c

从不适合你的评论来看sed -i,你不是在 Linux、Mac OS X 或 BSD 上工作——你在哪个平台上工作?(AIX、Solaris、HP-UX 是相对合理的可能性,但也有很多其他不太合理的可能性。)

您可以尝试使用 POSIX 命名的字符类,例如sed -e '/^[[:space:]]*$/d'; 它可能会起作用,但不能保证。你可以试试:

echo "Hello World" | sed 's/[[:space:]][[:space:]]*/   /'

如果可行,“Hello”和“World”之间将有三个空格。如果没有,您可能会从sed. 这可能会让您不必担心在命令行上输入标签。

于 2013-01-28T20:26:00.203 回答
8
grep . file

grep 逐行查看您的文件;点.匹配换行符以外的任何内容。因此, grep 的输出是由单个换行符以外的内容组成的所有行。

于 2013-01-28T20:38:18.097 回答
7

用 awk

awk 'NF > 0' filename

于 2013-01-29T01:13:18.653 回答
3

要彻底删除行,即使它们包含空格或制表符,在 perl 中也会这样做:

cat file.txt | perl -lane "print if /\S/"

当然还有 awk 和 sed 等价物。最好不要假设这些行完全是空白的^$

干杯

于 2013-01-28T20:32:47.237 回答
2

您可以 sed 的-i选项在不使用临时文件的情况下就地编辑:

 sed -i '/^$/d' file
于 2013-01-28T20:24:47.517 回答