다음 bash 스크립트를 실행하려고 합니다.
#!/bin/bash
file=$1
filename=${file%%.*}
line1=$(sed -n 1~2p ${file})
seqs=$(grep -v '^>' ${file})
pos=$(echo "${line1}" | awk -F"[__]" 'NF>2{print $2}')
(
awk -v str="${seqs}" -v str2="${pos}" -v str3="${line1}" -v name=${filename} -v sep="[$IFS]" '
BEGIN {
n = split(str, a, sep)
m = split(str2, b, sep)
k = split(str3, c, sep)
for (i=1;i<=n;i++) {o=10;d[$i]=b[i]-o;s[$i]=d[i]>0?d[i]:1; print c[i] "\n" substr(a[i],d[$i],2*o+(d[$i]<0?d[$i]:1)) > name"_flanks.fasta"}
}
'
)
하지만 나는 다음을 얻습니다.
$ ./test.sh myfile.fasta
./test.sh: line 10: /usr/bin/xargs: Argument list too long
버전 제어를 사용하지 않으면 약간의 불이익이 있지만 이전 버전의 코드에서는 작동했습니다. 이게 무슨 문제인 것 같나요?
편집하다:"head ${file} |"을 sed 및 grep 명령에 파이프하면 정상적으로 실행되지만 "cat ${file} |"을 실행하면 원래 오류가 발생합니다. 이것이 실제로 파일 크기 제한입니까? 계산을 더 작은 파일 청크로 분할해야 합니까?
의 출력은 "$seqs$
대략 6,000개의 요소입니다.
MEDEAVLDRGASFLKHVCDEEEVEGHHTIYIGVHVPKSYRRRRRHKRKTGHKEKKEKERISENYSDKSDIENADESSSSILKPLISPAAERIRFILGEEDDSPAPPQLFTELDELLAVDGQEMEWKETARWIKFEEKVEQGGERWSKPHVATLSLHSLFELRTCMEKGSIMLDREASSLPQLVEMIVDHQIETGLLKPELKDKVTYTLLRKHRHQTKKSNLRSLADIGKTVSSASRMFTNPDNGSPAMTHRNLTSSSLNDISDKPEKDQLKNKFMKKLPRDAEASNVLVGEVDFLDTPFIAFVRLQQAVMLGALTEVPVPTRFLFILLGPKGKAKSYHEIGRAIATLMSDEVFHDIAYKAKDRHDLIAGIDEFLDEVIVLPPGEWDPAIRIEPPKSLPSSDKRKNMYSGGENVQMNGDTPHDGGHGGGGHGDCEELQRTGRFCGGLIKDIKRKAPFFASDFYDALNIQALSAILFIYLATVTNAITFGGLLGDATDNMQGVLESFLGTAVSGAIFCLFAGQPLTILSSTGPVLVFERLLFNFSKDNNFDYLEFRLWIGLWSAFLCLILVATDASFLVQYFTRFTEEGFSSLISFIFIYDAFKKMIKLADYYPINSNFKVGYNTLFSCTCVPPDPANISISNDTTLAPEYLPTMSSTDMYHNTTFDWAFLSKKECSKYGGNLVGNNCNFVPDITLMSFILFLGTYTSSMALKKFKTSPYFPTTARKLISDFAIILSILIFCVIDALVGVDTPKLIVPSEFKPTSPNRGWFVPPFGENPWWVCLAAAIPALLVTILIFMDQQITAVIVNRKEHKLKKGAGYHLDLFWVAILMVICSLMALPWYVAATVISIAHIDSLKMETETSAPGEQPKFLGVREQRVTGTLVFILTGLSVFMAPILKFIPMPVLYGVFLYMGVASLNGVQFMDRLKLLLMPLKHQPDFIYLRHVPLRRVHLFTFLQVLCLALLWILKSTVAAIIFPVMILALVAVRKGMDYLFSQHDLSFLDDVIPEKDKKKKEDEKKKKKKKGSLDSDNDDSDCPYSEKVPSIKIPMDIMEQQPFLSDSKPSDRERSPTFLERHTSC
파일에는 다음과 같이 반복되는 데이터가 많이 포함되어 있습니다.
>Q9UM01_334_L_R
MVDSTEYEVASQPEVETSPLGDGASPGPEQVKLKKEISLLNGVCLIVGNMIGSGIFVSPKGVLIYSASFGLSLVIWAVGGLFSVFGALCYAELGTTIKKSGASYAYILEAFGGFLAFIRLWTSLLIIEPTSQAIIAITFANYMVQPLFPSCFAPYAASRLLAAACICLLTFINCAYVKWGTLVQDIFTYAKVLALIAVIVAGIVRLGQGASTHFENSFEGSSFAVGDIALALYSALFSYSGWDTLNYVTEEIKNPERNLPLSIGISMPIVTIIYILTNVAYYTVLDMRDILASDAVAVTFADQIFGIFNWIIPLSVALSCFGGLNASIVAASRLFFVGSREGHLPDAICMIHVERFTPVPSLLFNGIMALIYLCVEDIFQLINYYSFSYWFFVGLSIVGQLYLRWKEPDRPRPLKLSVFFPIVFCLCTIFLVAVPLYSDTINSLIGIAIALSGLPFYFLIIRVPEHKRPLYLRRIVGSATRYLQVLCMSVAAEMDLEDGGEMPKQRDPKSN
헤더(">"로 시작)를 읽고 위치 번호(334)를 제거한 다음 라인 2를 원하는 "시퀀스"로 지정하고 싶습니다.
위치로 이동하여 양쪽에서 pos[i]
최대 10개의 하위 문자열 위치를 선택합니다 . seqs[i]
예를 들어, 다음과 같이 반환하면:seqs[i]
pos[i]
pos[i] = 15
EYEVASQPEVETSPLGDGAS
전체 파일을 사용하지 않고도 이 작업을 수행할 수 있지만 모든 것을 awk로 직접 읽는 것이 쉘 변수를 통해 모든 것을 로드하는 것보다 프로그램을 더 효율적으로 만드는 것 같습니다.
답변1
awk
그냥 제안받은 대로 하는 게 어때요?@olivierdulac:
awk '/^>/{split($0,N,"_");n=N[2];print;next}{print substr($0,n-10,20)}' file > file_flanks.fasta
동일한:
awk -F'_' '/^>/{n=$2;print;next}{print substr($0,n-10,20)}' file > file_flanks.fasta
또는 배열 없이:
awk '/^>/{print;sub("[^_]*_","");n=$0+0;next}{print substr($0,n-10,20)}' file > file_flanks.fasta