如何从Unix文件中删除空白行

我需要从input文件中删除所有的空行,并写入输出文件。 这是我的数据如下。

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 
 sed -i '/^$/d' foo 

这告诉sed删除匹配正则expression式^$即每个空行的每一行。 -i标志就地编辑文件,如果你的sed不支持你可以把输出写到一个临时文件并replace原来的文件:

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

如果你还想删除只包含空格的行(不只是空行),则使用:

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

编辑:也删除行尾的空白,因为显然你已经决定你也需要:

 sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo 
 awk 'NF' filename 

 awk 'NF > 0' filename 

 sed -i '/^$/d' filename 

 awk '!/^$/' filename 

 awk '/./' filename 

NF还删除只包含空格或制表符的行,正则expression式/^$/不包含。

使用grep来匹配在起始锚点( ^ )和结束锚点( $ )之间没有任何内容的任何行:

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

如果你想删除只有空白的行,你仍然可以使用grep。 我在这个例子中使用Perl正则expression式,但是这里有其他的方法:

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

或者,没有Perl正则expression式:

 grep -v '^[[:space:]]*$' infile.txt > outfile.txt 
 sed -e '/^ *$/d' input > output 

删除所有只包含空格的行(或者完全为空)。 您可以将空白更改为[ \t] ,其中\t是制表符的表示。 不pipe你的shell还是你的sed都会做扩展,但是你可以直接inputtab字符。 如果您使用的是GNU或BSD sed ,则可以使用-i选项就地编辑,如果这是您想要的。


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

可能有几个原因。 这可能是因为你没有空白行,但是在行尾有很多空格,所以当你把文件拖到屏幕上的时候,看起来你有空行。 如果这是问题,那么:

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

新的正则expression式删除行尾的重复空格; 请参阅以前的讨论,了解空白或制表符。

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

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

如果两者都不起作用,那么你需要在文件的前两行显示一个hex转储或八进制转储( 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得到一个错误。 这可以帮助您避免在命令行上input标签。

 grep . file 

grep逐行查看你的文件; 点. 匹配换行符之外的任何内容。 因此grep的输出是所有由非换行符组成的行。

用awk

awk 'NF > 0' filename

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

  sed -i '/^$/d' file 

要彻底删除行, 即使它们包含空格或制表符在Perl中这样的事情会做到这一点:

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

当然有awk和sed的等价物。 最好不要认为这些行完全空白,因为^$会。

干杯