3

我有一个 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

决定我在想象空白行,但导入 Google 表格,它们仍然存在!开始质疑我的理智了!任何人都可以帮忙吗?

4

5 回答 5

1

使用-i选项将原始文件替换为已编辑的文件。

sed -i '/^[ \t]*$/d' file.csv

或者输出到另一个文件并重命名它,这正是它所做的-i

sed '/^[[:blank:]]*$/d' file.csv > file.csv.out && mv file.csv.out file.csv
于 2015-05-12T21:51:29.910 回答
1
sed -n -i '/44/p' file

-n 表示跳过打印
-i 就地(覆盖同一个文件)
- /44/p 打印存在 '44' 的行

不存在“44”

sed -i '/^\s*$/d' file

\s 匹配空格,^startofline,$endofline,d 删除行

于 2015-05-12T22:25:25.360 回答
1

鉴于:

$ 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:

$ awk 'NF>0' bl.txt
Line 1 (next line has a tab)
Line 2 (next has several space)
Line 3

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:

$ sed '/^[[:space:]]*$/d' bl.txt
Line 1 (next line has a tab)
Line 2 (next has several space)
Line 3
于 2015-05-12T23:02:28.573 回答
1

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

cat file.csv | tr -s \n

应该:

cat file.csv | tr -s '\n'  # more efficient alternative: tr -s '\n' < file.csv

否则,会吃掉\并且所tr看到的都是n

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

此外,-i(用于不区分大小写的匹配) ingrep -ir 44 file.csv是没有意义的,而使用-r(用于递归搜索)不会改变仅file.csv被搜索的事实,它:在每个匹配行前面加上文件名。


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

于 2015-05-12T23:26:01.663 回答
0

如果你喜欢awk,应该这样做:

awk '/44/' file

它只会打印包含44

于 2015-05-13T08:21:23.240 回答