我有一个像这样的文件,它是一个两列制表符分隔的文件。
CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA a2
我想得到这样的输出:
>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA
我试图在里面使用折叠命令awk。是否可以在其中使用另一个命令awk
?
另外,我想要的每行的宽度是15,所以我尝试了这样的方法,但它不起作用:
awk -F "\t" '{a=$(fold -w 50 $1);print a,$2}' file.txt
我怎样才能做到这一点?
答案1
这里有几种方法:
珀尔
perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file
awk
awk '{i=0; printf ">%s\n",$2; while(i<=length($1)){ printf "%s\n", substr($1,i,15);i+=15 }}' file
fold
如果你真的想在 awk 中使用,你可以这样做
awk '{printf ">%s\n",$2; system("echo " $1 "| fold -w 15 ") }' file
你的尝试失败了,因为$()
它是一个外壳,而不是一个awk
东西。要从内部运行系统命令awk
,您需要使用system()
.那么,为了通过价值$1
(序列)而不是 shell 的实际字符串($1
如果这样做,shell 将尝试评估它,并且由于未设置而返回空白$1
),因此您需要$1
从引号中排除 。
所以,在这个例子中,我使用
|-------------------------> closing quotes for the 1st part
| |----> closing quotes for the 2nd part
v v
system( " echo " $1 " | fold -w 15")
- ---- --- - ------------
| | | | |----------> the 2nd part
| | | |------------------> opening quotes for the 2nd part
| | |---------------------> The awk variable, `$1`,
| | outside the quotes.
| |-----------------------------> The 1st part
|--------------------------------> opening quotes for the 1st part
答案2
与python test.py < input
和test.py
:
import sys
for i in sys.stdin:
s, ident = i.rstrip().split()
print '>{0}'.format(ident)
while s:
print s[:15]
s = s[15:]
答案3
awk '{ print ">"$2 ; while (length($1)) { print substr($1,1,15) ; $1=substr($1,16) } }'