2013-05-06 83 views
0

我試圖根據第五個字段的值將文件拆分爲不同的較小文件。一個很好的方法是already suggestedalso here

不過,我正在嘗試將這個腳本合併到qsub的.sh腳本中,但沒有取得太大的成功。

的問題是,在指定的文件到輸出線路部分,

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

,我需要通過早期的腳本聲明的變量,它指定的目錄文件應該寫在哪裏。我需要使用爲每個任務構建的變量執行此操作,當我發送多個文件的陣列作業時。

所以說$output_path = ./Sample1

我需要寫類似

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

但它似乎不喜歡有$變量,是不是屬於一個AWK $場。我甚至不認爲它喜歡在$ 5前後有兩個「字符串」。

我回來的錯誤是,它需要拆分文件的第一行(little.sam),並試圖命名爲f,然後是/ Alignments_「$ 5」.sam「(最後三個放在一起正確)。它說,當然,這是太大的名稱。

我怎麼能寫這樣它的工作原理?

謝謝!

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,之後加入-v來AWK並聲明VARIAB 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 2013-05-06 21:44:58

+1

總是引用你的shell變量,除非你有一個非常具體的原因,並且完全意識到使用非引號變量時發生的文件名匹配,通配符擴展等等的警告和後果。另外,在'$ outputBase \ _TEST'中''_'是做什麼的?我想你可能正在編寫''$ {outputBase}/_ TEST「',但它根本不清楚。 – 2013-05-07 00:43:54

回答

1

要通過shell變量的值,如$output_pathawk您需要使用-v選項。

$ 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錯誤留在你的腳本

編輯:

-v創建的awk變量是obase但是你用newdir你想要的是:

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,因爲你一定已經忘了你發佈了多少個關於「如何使用shell var with awk」的答案:) – Kent 2013-05-06 21:49:14

+0

@Kent哈哈它確實頻繁出現,可能更糟糕就像每個解析HTML的'php'問題與正則表達式。 – 2013-05-06 21:51:09

+0

謝謝,sudo_O 我追加-v和聲明變量後仍然收到一條錯誤消息。 我已將這個新錯誤附加到我的問題。 – 2013-05-06 22:10:00

1

AWK變量就像C變量 - 只是引用他們的名字來獲得自己的價值,沒有必要堅持一個「$」在他們面前就像你做的shell變量:

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 ... .you :) – Kent 2013-05-06 21:50:47