在该文件内的模式之前写入文件名

在该文件内的模式之前写入文件名

我有数千个类似的文件,我想在其中的模式后面写下它们各自的名称。例如:

**文件 1 的名称是 nexus0000

文件里面有:

>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

我想得到这个:

nexus0000>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0000>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

**文件2的名称是nexus0001

文件里面有:

>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

我想得到这个:

nexus0001>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0001>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

ETC。

到目前为止,我只能使用以下命令在第一行写入文件名:

for file in nexus*; do echo "$file"$"$(cat -- "$file")" > "$file"; done

谢谢您的帮助!

答案1

sed解决方案:

for f in nexus*; do sed -i "s/^>/$f&/" "$f"; done

或者使用呆呆地及其inplace扩展(自 v.4.1.0 起可用):

for f in nexus*; do awk -i inplace '/^>/{ $0=FILENAME$0 }1' "$f"; done

答案2

find . ! -name . -prune -type f -name nexus\* -exec perl -i'' -pe 's/^>/$ARGV>/' {} +

我们find仅针对当前目录启动,查找常规文件,名称以 开头,然后通过用文件名+本身替换行开头的找到的nexus内容来对多个此类文件进行就地编辑。>

答案3

这可以使用 Perl 单行代码轻松完成,如下所示:

perl -i -pe 's/>/$ARGV$_/g' nexus*

请注意,它-i会就地更改文件,因此如果您只想测试该命令,请先在不带-i标志的情况下运行它。

相关内容