删除文件中的行

删除文件中的行

我的文件夹中有很多文件:

$ ls -hlS | head
total 75M
-rw-r--r-- 1 ubuntu ubuntu 511 Aug  3 16:27 NW_009517088.1.lst
-rw-r--r-- 1 ubuntu ubuntu 478 Aug  3 16:27 NW_009539008.1.lst
-rw-r--r-- 1 ubuntu ubuntu 471 Aug  3 16:27 NW_009386266.1.lst
-rw-r--r-- 1 ubuntu ubuntu 471 Aug  3 16:27 NW_009411177.1.lst
-rw-r--r-- 1 ubuntu ubuntu 451 Aug  3 16:27 NW_009514912.1.lst

每个文件的内容*.lst如下所示:

$ cat NW_009514912.1.lst
rna-NisyCt036+
cds-YP_358756.1-
rna-NisyCt037+
cds-YP_358757.1+
cds-YP_358758.1+
cds-YP_358758.1+
id-NisyCp117-1+
id-NisyCp117-2+
id-LOC104209938-1-
rna-XM_009770987.1-
rna-XM_009780247.1+
rna-XM_009783083.1+
rna-XM_009784022.1-
rna-TRNAN-GUU+

如何从每个*.lst文件中删除不以 开头的行rna-XM_

答案1

假设你想删除全部不以rna-XM_(= 开头​​的行仅保留那些rna-XM_) 开始,您可以尝试以下操作:

for file in *.lst; do awk '/^rna-XM_/' "$file" > "${file}.new"; done

这将循环遍历名称以 结尾的所有文件.lst,并仅打印以 开头的行rna-XM_,其中输出写入文件(如果您想替换原始文件内容,filename.lst.new则可能必须重命名为该文件)。filename.lst

这同样适用于sed(参见@Rakesh Sharma 的评论):

for file in *.lst; do sed '/^rna-XM_/!d' "$file" > "${file}.new"; done

如果您确信代码正确,则可以使用sed和 state的“内联”编辑功能

for file in *.lst; do sed -i '/^rna-XM_/!d' "$file"; done

这将就地修改文件,因此您不必将其重命名filename.lst.newfilename.lst

请注意,“shell- for-loop”方法比解析输出find(在一些评论中建议)如果您的文件名可以包含特殊字符。尽管 GNU 实现findxargs具有-print0-0选项来处理这些情况,但它不可移植。

答案2

您可以使用下面的 find 命令在当前目录中检查文件扩展名 *.lst 并删除文件中不以“rna”开头的所有行

find . -maxdepth 1 -type f -name "*.lst" -exec sed -i '/^rna/!d' {} \;

相关内容