我有数千个类似的文件,我想在其中的模式后面写下它们各自的名称。例如:
**文件 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
标志的情况下运行它。