我在前5-10行中包含多个包含ascii文本信息的文件,然后是格式良好的矩阵信息。在shell脚本中,我想删除文本的前几行,以便可以在另一个程序中使用纯矩阵信息。如何使用bash shell命令执行此操作?

如果有帮助,我正在使用RedHat和Ubuntu Linux系统。

#1 楼

只要文件不是符号链接或硬链接,就可以使用sed,tail或awk。下面的例子。 :sed -i -e 1,3d yourfile。这不会回显任何内容,只会在适当位置修改文件。如果不需要将结果通过管道传递到另一个命令,则更容易。 br />
$ cat t.txt
12
34
56
78
90


评论


您也可以在没有临时文件的情况下就位使用sed:sed -i -e 1,3d yourfile。这不会回显任何内容,只会在适当位置修改文件。如果您不需要将结果通过管道传递到另一个命令,则这会更容易。

– Yanick Girouard
2012年5月2日23:46

感谢@ YanickGirouard,@ IgnacioVazquezAbrams!你们两个刚刚为我节省了很多研究工作! :)

– Paul
2012年9月6日下午5:22

@Svetlana sed -i特别是。大多数实现只是删除文件并用一个新文件代替,这对链接不起作用,因为最终将原始文件留在其他位置。

– jw013
2014年1月7日22:21

如何解释“ 1,3d”,+ 4等。手段?问题是n行,但您没有告诉n是什么(在示例中n显然是2,尽管对于noob来说要更改n改变什么并不明显)

–罗宾·马诺利(Robin Manoli)
2015年2月1日在10:29



这使用了一个临时文件,因此对于100%的使用磁盘空间不是很有用。有一种解决方案可以按字面上“就地”执行此操作将很有趣。

–上海
16年9月2日在21:09

#2 楼

sed -i '1,3d' file.txt

这将从file.txt中删除前3行。

评论


我需要从10GB以上的文本文件中删除前50行。即使应该“就地”运行,该命令仍然需要几分钟。有没有真正快速的选择?

–塞巴斯蒂安
19-10-25在8:09

@Sébastien如果只需要删除前50行,请在文本编辑器中打开文件,选择前50行并删除它们?用此命令删除7GB +文本文件的8 473 386第一行花了17秒,我不得不承认我发现它非常快。

– smonff
20年4月6日在9:13

#3 楼

如果列表行是带有制表符的行: br />
在bash / ksh / zsh脚本中,您可以为标签页编写,例如$'\t'grep $'\t'

如果要在文件开头消除10行: 10行,因为sed -n $'/\t/p'的意思是“从第11行开始”,尾号从1开始的行)或

修改文件到位:

grep '␉' <input_file >output_file


或者您可以使用shell循环和临时文件:

sed -n '/␉/p' <input_file >output_file


或者,如果您不想就地修改文件,而是给它们改一个名称:

tail -n +11 <input_file >output_file


评论


“制表”通常是指“漂亮地打印在表中”,而不是“缩进制表符”。

–伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)
2012年5月3日,2:14

我知道@ IgnacioVazquez-Abrams。打印精美的表有时使用制表符,比对齐的列更容易发现。当然,如果Paul提供了示例输入,我可以提供更好的匹配器。

–吉尔斯'所以-不再是邪恶的'
2012年5月3日在10:04

#4 楼

您可以在Ex模式下使用Vim:

 ex -sc '1d5|x' file
 



1移至第一行
5选择5行
d删除
x保存并关闭


#5 楼

按百分比

使用bash,使用百分比数字而不是绝对行数来清理文件:

 sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log
 


请注意,因为该命令可能会破坏性,因为它会在不创建副本的情况下就地删除内容。

它将删除前75%的内容。提到文件中的行。

#6 楼

# deletes first line
echo "a\nb" | sed '1d' 

# read list.txt and write list.csv without first line
cat list.txt | sed '1d' > list.csv 


其他有用的命令:

# finds first character (pipe|)
grep '^|' 

# deletes pipe
sed 's/|//g'  

# deletes space
sed 's/ //g'