如果文本文件为空,我如何删除文本文件的第一行(!),例如使用sed或其他标准UNIX工具。我试过这个命令:
sed '/^$/d' < somefile
但是这将删除第一个空行,而不是文件的第一行,如果它是空的。关于行号,我可以给sed一些条件吗?
根据Levon的回答,我基于awk构建了这个小脚本:
#!/bin/bash
for FILE in $(find some_directory -name "*.csv")
do
echo Processing ${FILE}
awk '{if (NR==1 && NF==0) next};1' < ${FILE} > ${FILE}.killfirstline
mv ${FILE}.killfirstline ${FILE}
done
答案 0 :(得分:15)
sed中最简单的事情是:
sed '1{/^$/d}'
请注意,这不会删除包含所有空格的行,而只会删除只包含一个换行符的行。摆脱空白:
sed '1{/^ *$/d}'
并消除所有空格:
sed '1{/^[[:space:]]*$/d}'
答案 1 :(得分:2)
如果您不必就地执行此操作,则可以使用awk
并将输出重定向到其他文件。
awk '{if (NR==1 && NF==0) next};1' somefile
这将打印文件的内容,除非它是第一行(NR == 1
)并且它不包含任何数据(NF == 0
)。
NR
当前行号,NF
给定行上由空格/制表符分隔的字段数
如,
$ cat -n data.txt
1
2 this is some text
3 and here
4 too
5
6 blank above
7 the end
$ awk '{if (NR==1 && NF==0) next};1' data.txt | cat -n
1 this is some text
2 and here
3 too
4
5 blank above
6 the end
和
cat -n data2.txt
1 this is some text
2 and here
3 too
4
5 blank above
6 the end
$ awk '{if (NR==1 && NF==0) next};1' data2.txt | cat -n
1 this is some text
2 and here
3 too
4
5 blank above
6 the end
更新:
此sed
解决方案也适用于就地替换:
sed -i.bak '1{/^$/d}' somefile
原始文件将以.bak
扩展名
答案 2 :(得分:2)
使用sed,试试这个:
sed -e '2,$b' -e '/^$/d' < somefile
或进行更改:
sed -i~ -e '2,$b' -e '/^$/d' somefile
答案 3 :(得分:1)
如果第一行为空,则删除实际目录下所有文件的第一行:
find -type f | xargs sed -i -e '2,$b' -e '/^$/d'
答案 4 :(得分:0)
这可能对您有用:
sed '1!b;/^$/d' file