如何从Unix文件中删除空行

Tej*_*eja 46 unix awk blank-line

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

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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ely 88

sed -i '/^$/d' foo
Run Code Online (Sandbox Code Playgroud)

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

sed '/^$/d' foo > foo.tmp
mv foo.tmp foo
Run Code Online (Sandbox Code Playgroud)

如果您还想删除仅由空格组成的行(不仅仅是空行),请使用:

sed -i '/^[[:space:]]*$/d' foo
Run Code Online (Sandbox Code Playgroud)

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

sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo
Run Code Online (Sandbox Code Playgroud)

  • 我认为这种可能性如此写了"如果你的sed不支持那个"部分.似乎至少有七个人浪费了他们的时间试图帮助你,你要么没有阅读,要么没有正确思考. (8认同)
  • 所以不要使用`-i`选项!你看过我的回答了吗? (5认同)
  • 任何在Mac上遇到-i选项问题的人:使用`-i .bak`代替(如`sed -i .bak'/ ^ [[:space:]]*$/d'foo`.版本sed我们想要在进行就地编辑时使用文件扩展名.所以传递`-i .bak`告诉它复制现有文件的扩展名为`.bak`你可以恢复到就地编辑失败. (3认同)

Jot*_*tne 38

awk 'NF' filename
Run Code Online (Sandbox Code Playgroud)

awk 'NF > 0' filename
Run Code Online (Sandbox Code Playgroud)

sed -i '/^$/d' filename
Run Code Online (Sandbox Code Playgroud)

awk '!/^$/' filename
Run Code Online (Sandbox Code Playgroud)

awk '/./' filename
Run Code Online (Sandbox Code Playgroud)

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


gpo*_*ojd 15

使用grep匹配start anchor(^)和end anchor($)之间没有任何内容的任何行:

grep -v '^$' infile.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

如果要删除仅包含空格的行,仍可以使用grep.我在这个例子中使用Perl正则表达式,但是还有其他方法:

grep -P -v '^\s*$' infile.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

或者,没有Perl正则表达式:

grep -v '^[[:space:]]*$' infile.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 12

sed -e '/^ *$/d' input > output
Run Code Online (Sandbox Code Playgroud)

删除仅包含空格(或完全为空)的所有行.你可以改变空白到[ \t]其中\t是选项卡的表示.无论您的shell还是您sed的扩展都会有所不同,但您可以直接键入制表符.如果您正在使用GNU或BSD sed,您可以使用该-i选项就地编辑,如果这是您想要的.


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

可能有几个原因.可能是您没有空白行,但在行尾有很多空格,因此当您将文件捕捉到屏幕时,看起来有空白行.如果这是问题,那么:

sed -e 's/  *$//' -e '/^ *$/d' input > output
Run Code Online (Sandbox Code Playgroud)

新的正则表达式删除了行尾的重复空白; 请参阅前面关于空白或制表符的讨论.

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

tr -d '\015' < input | sed -e 's/  *$//' -e '/^ *$/d' > output
Run Code Online (Sandbox Code Playgroud)

如果这些都不起作用,那么你需要显示od -c文件的前两行的十六进制转储或八进制转储(),这样我们就可以看到我们正在反对的内容:

head -n 2 input | od -c
Run Code Online (Sandbox Code Playgroud)

sed -i从不适合您的评论来看,您不是在使用Linux或Mac OS X或BSD - 您正在使用哪个平台?(AIX,Solaris,HP-UX作为相对合理的可能性而浮现在脑海中,但是还有很多其他不太合理的可能性.)

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

echo "Hello World" | sed 's/[[:space:]][[:space:]]*/   /'
Run Code Online (Sandbox Code Playgroud)

如果它有效,'Hello'和'World'之间将有三个空格.如果没有,你可能会收到错误sed.这可能会让您在命令行上输入标签时感到悲伤.

  • 哦FFS,**如果你提出错误的问题,没有人可以正确回答!** (9认同)

Ed *_*ton 8

grep . file
Run Code Online (Sandbox Code Playgroud)

grep逐行查看你的文件; 该点.匹配换行符之外的任何内容.因此,grep的输出是由除单个换行之外的其他内容组成的所有行.

  • 19个字的解释真的太过分吗? (5认同)
  • 没有什么比关于你的帖子太短的复制粘贴错误消息毫无意义?我们对"无意义"有不同的定义. (2认同)

Ran*_*ngh 6

用awk

awk 'NF > 0' filename

  • 仅靠'awk'NF'`就足够了。 (2认同)