이와 같은 파일이 있는데, 이는 탭으로 구분된 두 개의 열로 구성된 파일입니다.
CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA a2
다음과 같은 출력을 얻고 싶습니다.
>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA
내부에서 접기 명령을 사용하려고 합니다.앗. 다른 명령을 사용할 수 있습니까 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 '{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
(시퀀스) 대신에 쉘의 실제 문자열( $1
이렇게 하면 쉘은 이를 평가하려고 시도하고 설정되지 않았기 때문에 공백을 반환합니다 )이므로 따옴표에서 제외 $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) } }'