1

我有一个由许多条目组成的文件,如下所示:

>1761420406686363113470.1
CAAGATTCTGAGATAATCGCGGTTTAAAGTTTCAAATTTGTTTCGGCCGATTCGAAGTCA

即以 > 开头的标题行和许多序列行,然后是标题行。我正在尝试编写一个 sed 脚本,该脚本仅转到以 > 开头的行(而不是序列行),并删除除前 10 个数字之外的所有数字。

有很多类似的问题,但我无法弄清楚。我一直在尝试对此代码的变体:

sed 's/^>..........*/^>........../' input.fasta

但显然我做得不对..

4

4 回答 4

3

这可能对您有用(GNU sed):

sed -r 's/^(>.{10}).*/\1/p;d' file

如果要保留序列行,这将删除除那些被替换的行之外的所有行:

sed -r 's/^(>.{10}).*/\1/' file

应该符合要求。

于 2013-06-10T20:56:33.730 回答
1

您必须捕获括号中的前 10 个字符:

sed -e 's/^\(>..........\).*/\1/'

可以缩短为

sed -e 's/^\(>.\{10\}\).*/\1/'
于 2013-06-10T20:56:32.790 回答
1

作为 sed 的替代品,使用 cut

$ echo ">1761420406686363113470.1" | cut -c1-11
>1761420406

要对以 开头的行进行操作>,请将其包装在 bash-while-loop 中

$ while read line; do if [[ $line == \>* ]]; then cut -c1-11 <<< $line; else echo $line; fi done < input
>1761420406
CAAGATTCTGAGATAATCGCGGTTTAAAGTTTCAAATTTGTTTCGGCCGATTCGAAGTCA

或使用 awk:

$ awk '{if ($0 ~ />/){print substr($0,0,11)}else{print}}' input
>1761420406
CAAGATTCTGAGATAATCGCGGTTTAAAGTTTCAAATTTGTTTCGGCCGATTCGAAGTCA
于 2013-06-10T20:57:44.413 回答
0

sed由于已经发布了好的答案,这里有一个 `GNU-awk 解决方案。

gawk '/^>/{print gensub(/(.{11}).*/,"\\1","G",$1);next }1' inputFile
于 2013-06-10T21:11:39.097 回答