在文本文件中某些行的末尾附加文件名

Appending filename at the end of certain lines in a text file

我试图在我连接的许多文件的某些行的末尾附加一个文件名。

简短示例:

输入:

filename (1): 1234_contigs.fasta
>NODE_STUFF
GATTACA

filename (2): 5678_contigs.fasta
>NODE_TUFF
TGTAATC

输出:

>NODE_STUFF-1234
GATTACA
>NODE_TUFF-5678
TGTAATC

我用作脚手架的代码是从另一个 post 征用的,我最成功的迭代是:

for i in ./*/*contigs.fasta; do sed '/^>NODE.*/ s/$/-(basename $i _contigs.fasta)/' /g $i; done

>NODE_STUFF-(basename $i _contigs.fasta)
GATTACA
>NODE_TUFF-(basename $i _contigs.fasta)
TGTAATC


for i in ./*/*contigs.fasta; do sed s/'^>NODE.*'$/$(basename $i _contigs.fasta)\ /g $i; done
1234 
GATTACA
4568 
TGTAATC

虽然我看到许多类似的问题,但我无法找到一种方法来仅使用这些文件中的某些行(在功能上等同于此示例的 .txt)。我相信我的混乱结果是由于处理文字时的错误造成的,但是经过几十次记录不佳的引号尝试后,我感到失落多于发现。请注意,每个文件都可以包含许多以 >NODE 开头的行,我也希望附加文件名。

使用您显示的示例,请尝试以下 awk 代码。我们不需要使用 for 循环来遍历所有文件, awk 可以自行读取所有文件。简单的解释是,寻找以 > 开头的行,如果是,则打印当前行,然后是 -,然后是 _ 之前的当前文件名的值,否则(如果行不是从 >) 打印当前行开始。

awk '/^>/{file=FILENAME;sub(/_.*/,"",file);print [=10=]"-"file;next} 1' *.fasta

更准确地说:

awk '/^>/{file=FILENAME;sub(/_.*/,"",file);[=11=]=[=11=]"-"file} 1' *.fasta

使用 bash 和 sed 我建议:

for i in ./*/*contigs.fasta; do
   n=$(basename -s _contigs.fasta "$i")
   sed "s/^\(>NODE.*\)/-$n/" "$i"
done

尝试

for file in */*_contigs.fasta; do
    filenum=${file%_contigs.fasta}
    filenum=${filenum##*/}

    sed -- "s/^>NODE.*$/&-${filenum}/" "$file"
done