在文本文件中某些行的末尾附加文件名
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
- 有关
${file%_contigs.fasta}
和 ${filenum##*/}
的解释,请参阅 Removing part of a string (BashFAQ/100 (How do I do string manipulation in bash?))。
我试图在我连接的许多文件的某些行的末尾附加一个文件名。
简短示例:
输入:
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
- 有关
${file%_contigs.fasta}
和${filenum##*/}
的解释,请参阅 Removing part of a string (BashFAQ/100 (How do I do string manipulation in bash?))。