在文件的行尾添加一个符号(#!)

时间:2013-04-24 11:47:54

标签: python bash file

我有一些文件,前三行只是一个标题。但是对我来说,他们需要一个注释符号,就像#一样。 如果我的文件被调用test.txt(如下所示),如何仅向前三行添加#,如果可能,则如果已有#则不添加评论符号

A    B    C    D
1    2    3    4

131  4.32  23  42
132  4.31  22  42
...  ...  ... ...

在前三行之后我得到了我的实际数据。所以我希望它是:

#A    B    C    D
#1    2    3    4
#
131  4.32  23  42
132  4.31  22  42
...  ...  ... ...

所以我可以轻松地在python中加载例如np.loadtxt('test.txt')的数据。 我认为它在bash中最容易,但python也没关系。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您使用bash标记了问题,因此您可以在shell中尝试使用此sed one-liner:

sed '1,3s/^/#/' file

如果您想“就地”进行更改:添加-i

sed -i '1,3s/^/#/' file

修改

如果已经领先#

,请跳过该行
sed '1,3{/^#/!s/^/#/}' 

答案 1 :(得分:1)

如果您想使用awk,这可以有效:

awk '(NR<=3 && !/^#/) {$0="#"$0} {print}' your_file

解释

(NR<=3 && !/^#/)代表行数&lt; = 3,行不以#开头。在这种情况下,我们会使用#更新前导$0="#"$0的行。如果条件不匹配,我们只需打印{print}行。

测试

没有任何#

$ cat s
A    B    C    D
1    2    3    4

131  4.32  23  42
132  4.31  22  42

$ awk '(NR<=3 && !/^#/) {$0="#"$0} {print}' s
#A    B    C    D
#1    2    3    4
#
131  4.32  23  42
132  4.31  22  42

已经有一些#

$ cat s
#A    B  #  C    D
1    2    3    4

131  4.32  23  42
132  4.31  22  42

$ awk '(NR<=3 && !/^#/) {$0="#"$0} {print}' s
#A    B  #  C    D
#1    2    3    4
#
131  4.32  23  42
132  4.31  22  42