【问题标题】:How can I change the first line of multiple files including the name of the file?如何更改多个文件的第一行,包括文件名?
【发布时间】:2021-05-10 21:04:44
【问题描述】:

我的文件夹中有很多文件,名为:

ctg_1.fasta
lcd2_13.fasta 
..
etc (all of them are .fasta)

我想将它们的第一行更改为包括以下内容:>ctg_1>lcd2_13。我的意思是,每个文件都有自己的名称作为第一行。

我认为命令sed 会帮助我。我试图执行这个:

var=">ctg_1"
sed -i "1s/.*/$var/" ctg_1.fasta

它可以工作,但我想递归地做,每个文件都包含自己的名字。

您知道我该如何实现这一目标吗?

【问题讨论】:

标签: linux bash sed


【解决方案1】:

使用find 递归获取所有文件。从带有文件名的变量中提取不带.fasta后缀的文件名,并在sed命令中使用。

find . -type f -name '*.fasta' | while read -r f; do
    base=$(basename "$f" .fasta)
    sed -i "1s/.*/>$base/" "$f"
done

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed 和并行):

    parallel sed -i '1s/.*/>{}/' {} ::: *.fasta
    

    -i 选项导致修改后的文件就地完成,每个文件都有自己的行号,因此1s/.*/>{}/' replaces the first line of each file by a >and the{}` 是并行命令获得的文件名。

    【讨论】:

      【解决方案3】:

      你可以使用 GNU awk:

      awk -i inplace 'FNR==1{a=FILENAME;sub(/\.[^.]+$/, "", a);print a}1' *.fasta
      

      详情:

      • -i inplace - 就地替换
      • FNR==1 - 如果当前行是第一行
      • {a=FILENAME;sub(/\.[^.]+$/, "", a);print a} - 将文件名分配给a,删除最后一个点和其后的所有文本,然后打印结果
      • 1 - 默认打印操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 2023-04-01
        • 2016-12-29
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 2016-08-04
        相关资源
        最近更新 更多