次の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