/usr/bin/awk: 인수 목록이 너무 깁니다.

/usr/bin/awk: 인수 목록이 너무 깁니다.

다음 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

관련 정보