2013-05-06 4 views
0

다섯 번째 필드의 값에 따라 다른 작은 파일로 파일을 분할하려고합니다. 이 작업을 수행하는 가장 좋은 방법은 already suggestedalso here입니다.

그러나 저는 이것을 qsub 용 .sh 스크립트에 통합하려고하는데 많은 성공을 거두지 못했습니다.

문제는 파일이 라인이 지정하는 출력 섹션,

즉, f = "Alignments_" $5 ".sam" print > f

에, 나는 디렉토리를 지정 이전 스크립트에서 선언 된 변수를 전달할 필요가있다 여기서 파일을 작성해야합니다. 여러 파일에 대한 배열 작업을 보낼 때 각 작업에 대해 빌드 된 변수를 사용하여이 작업을 수행해야합니다.

그래서 내가

f = $output_path "/Alignments_" $5 ".sam"  print > f 

같은 것을 작성해야하지만 AWK에 속하는 $ 필드가 아닌 $ 변수를 가지고 좋아하지 않는 것 $output_path = ./Sample1

말한다. 나는 $ 5 전후에 두 개의 "문자열"을 갖는 것을 좋아한다고 생각조차하지 않습니다.

내가 되돌아 오는 오류는 파일의 첫 번째 줄 (little.sam)을 잘라내어 f과 같이 이름을 지정하고 그 뒤에/Alignments_ "$ 5".sam "(올바르게 마지막 세 줄을 넣음)). 그것은 너무 큰 이름이다, 자연스럽게 말한다.

을 내가 AWK에게 -V를 추가 한 후이 그래서?

감사합니다!

awk -F '[:\t]' ' # read the list of numbers in Tile_Number_List 
    FNR == NR { 
     num[$1] 
     next 
    } 

    # process each line of the .BAM file 
    # any lines with an "unknown" $5 will be ignored 
$5 in num { 
    f = "Alignments_" $5 ".sam"  print > f 
} ' Tile_Number_List.txt little.sam 

UPDATE를 작동 쓸 수있는 방법 변형 문자 선언하기 LE OPATH는

input=$1 
outputBase=${input%.bam} 

mkdir -v $outputBase\_TEST 

newdir=$outputBase\_TEST 

samtools view -h $input | awk 'NR >= 18' | awk -F '[\t:]' -v opath="$newdir" ' 

FNR == NR { 
    num[$1] 
    next 
} 

$5 in num { 
    f = newdir"/Alignments_"$5".sam"; 
    print > f 
} ' Tile_Number_List.txt - 

mkdir: created directory little_TEST' 
awk: cmd. line:10: (FILENAME=- FNR=1) fatal: can't redirect to `/Alignments_1101.sam' (Permission denied) 
+0

시도'추가 ;''$ 5 ".sam"'다음에 또는'print> f'를 새로운 행에 넣습니다. – Kent

+1

따옴표로 묶지 않은 변수를 사용할 때 발생하는 파일 이름 globbing, 와일드 카드 확장 등의주의 사항 및 결과를 완전히 알지 못하는 특별한 이유가없는 한 항상 쉘 변수를 인용하십시오. 또한'$ outputBase \ _TEST'에서'\ _'을 (를) 의도 한 것은 무엇입니까? 아마도 당신은''$ {outputBase}/_ TEST ''를 쓰려고 노력하고있을 것입니다. 그러나 그것은 명확하지 않습니다. –

답변

1

같은 당신이 -v 옵션을 사용할 필요가 $output_pathawk에로 쉘 변수의 값을 전달합니다. 당신이 원하는 것은

-v로 만든 awk 변수가 obase하지만 당신이 newdir를 사용한다 :

$ output_path=./Sample1/ 

$ awk -F '[:\t]' -v opath="$ouput_path" '  
    # read the list of numbers in Tile_Number_List 
    FNR == NR { 
     num[$1] 
     next 
    } 

    # process each line of the .BAM file 
    # any lines with an "unknown" $5 will be ignored 
    $5 in num { 
     f = opath"Alignments_"$5".sam" 
     print > f 
    } ' Tile_Number_List.txt little.sam 

또한 당신은 여전히 ​​당신의 스크립트에 남아 당신의 previous question에서 오류를

EDIT 가지고

input=$1 outputBase=${input%.bam} mkdir -v $outputBase\_TEST newdir=$outputBase\_TEST samtools view -h "$input" | awk -F '[\t:]' -v opath="$newdir" ' FNR == NR && NR >= 18 { num[$1] next } $5 in num { f = opath"/Alignments_"$5".sam" # <-- opath is the awk variable not newdir print > f }' Tile_Number_List.txt - 

NR >= 18도 두 번째 awk 스크립트로 이동해야합니다.

+1

+1, "awk로 셸 변수를 사용하는 법"에 대해 몇 개의 답변을 게시했는지 잊어 버렸을 것입니다. :) – Kent

+0

@Kent 하하는 자주 올지도 모릅니다. HTML을 파싱 할 때마다 하나의'php' 질문처럼 더 나쁠 수도 있습니다. 정규 표현식으로. –

+0

고마워, sudo_O -v를 추가하고 변수를 선언 한 후에도 여전히 오류 메시지가 표시됩니다. 본인의 질문에이 새로운 오류가 추가되었습니다. –

1

AWK 변수는 C 변수처럼 - 단지 자신의 가치를 얻기 위해 이름을 참조하면 쉘 변수처럼 그들 앞에 "$"를 고집 할 필요가 없습니다 :

awk -F '[:\t]' ' # read the list of numbers in Tile_Number_List 
    FNR == NR { 
     num[$1] 
     next 
    } 

    # process each line of the .BAM file 
    # any lines with an "unknown" $5 will be ignored 
$5 in num { 
    output_path = "./Sample1/" 
    f = output_path "Alignments_" $5 ".sam" 
    print > f 
} ' Tile_Number_List.txt little.sam 
+0

+1 .... 너도. :) – Kent