Awk 删除空行

Awk 删除空行,awk,sed,grep,tr,blank-line,Awk,Sed,Grep,Tr,Blank Line,我有一个csv文件,其中每隔一行是空白的。我什么都试过了,没有什么能消除皱纹。使之更容易的是,数字44出现在每个有效行中。我尝试过的事情: grep -ir 44 file.csv sed '/^$/d' <file.csv cat -A file.csv sed 's/^ *//; s/ *$//; /^$/d' <file.csv egrep -v "^$" file.csv awk 'NF' file.csv grep '\S' file.csv sed 's/^ *//; s

我有一个csv文件,其中每隔一行是空白的。我什么都试过了,没有什么能消除皱纹。使之更容易的是,数字44出现在每个有效行中。我尝试过的事情:

grep -ir 44 file.csv
sed '/^$/d' <file.csv
cat -A file.csv
sed 's/^ *//; s/ *$//; /^$/d' <file.csv
egrep -v "^$" file.csv
awk 'NF' file.csv
grep '\S' file.csv
sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' <file.csv
cat file.csv | tr -s \n
grep-ir 44 file.csv

sed'/^$/d'使用
-i
选项将原始文件替换为已编辑的文件

sed -i '/^[ \t]*$/d' file.csv
或者输出到另一个文件并重命名它,这正是
-i
所做的

sed '/^[[:blank:]]*$/d' file.csv > file.csv.out && mv file.csv.out file.csv
-n表示跳过打印
-i就地(覆盖同一文件)
-/44/p存在“44”的打印行

没有"44"在场

sed -i '/^\s*$/d' file
\s是匹配的空格,^startofline,$endofline,d删除行

给定:

$ cat bl.txt
Line 1 (next line has a tab)

Line 2 (next has several space)

Line 3
您可以使用Perl删除空行:

$ perl -lne 'print unless /^\s*$/' bl.txt
Line 1 (next line has a tab)
Line 2 (next has several space)
Line 3
awk:

sed+tr:

$ cat bl.txt | tr '\t' ' ' | sed '/^ *$/d'
Line 1 (next line has a tab)
Line 2 (next has several space)
Line 3
刚才:

$ sed '/^[[:space:]]*$/d' bl.txt
Line 1 (next line has a tab)
Line 2 (next has several space)
Line 3

除了命令没有显示您将其输出捕获到一个新文件中以代替原始文件之外,它们没有任何问题,除了:

cat file.csv | tr -s \n
应该是:

cat file.csv | tr -s '\n'  # more efficient alternative: tr -s '\n' < file.csv
cat file.csv | tr-s'\n'#更有效的替代方案:tr-s'\n'
否则,shell将吃掉
\
,而
tr
看到的只是
n

但是,请注意,上面的命令仅消除真正的空行,而其他一些命令也消除空行(空或全部空白)

另外,
grep-ir 44 file.csv
中的
-i
(用于不区分大小写的匹配)是毫无意义的,虽然使用
-r
(用于递归搜索)不会改变只搜索
file.csv
的事实,但它会在每个匹配行前加上文件名,后跟



如果您确实在一个新文件中捕获了输出,并且该文件确实仍然有空行,那么您在问题中已经提到的
cat-a
cat-et
,在类似BSD的平台上)应该以
^
序列的形式显示文件中是否存在任何异常字符,例如
^M
用于
\r
字符。

如果您喜欢
awk
,则应执行以下操作:

awk '/44/' file

它将只打印包含
44

的行,这可能是行尾(DOS/Unix/Mac)的问题吗?很好,不过应该注意的是,第一个解决方案需要GNU
sed
。您可以通过将
[\t]
替换为
[[:blank:][]
来实现第二个解决方案的可移植性。噢,非常感谢您提供的这一信息性评论。我马上换!
cat file.csv | tr -s '\n'  # more efficient alternative: tr -s '\n' < file.csv
awk '/44/' file