2017-02-28 57 views
-1

我對shell腳本的世界比較陌生,因此希望這不會太困難。我有一個文件(dirlist)與目錄列表。我想與路徑的每個文件 在循環中命名awk輸出

    1. 貓「dirlist」使用的程序調用samtools從dirlist
    2. 用awk修改文件子集上一個變量chr17的samtools輸出
    3. 輸出寫入到使用該目錄的第8場一個文件,從「dirlist」命名
    4. 在dirlist中列出的所有文件,這樣做

    我想我在這裏有所有的作品。項目1-3工作正常,但循環只是命名文件「回聲」。

    for i in `cat dirlist`; do samtools depth $i | awk '$1 == "chr17" {print $0}' echo $i | awk -F'[/]' '{print $8}'; done 
    

    任何幫助,將不勝感激

  • +0

    [不要讀與行' for'](http://mywiki.wooledge.org/DontReadLinesWithFor)。相反,請參閱[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001)以獲取相關最佳做法。 –

    +0

    我強烈建議通過http://shellcheck.net/運行你的代碼並修復它發現的內容。即使沒有滾動查看完整的代碼,也可以看到一些明顯的引用錯誤。 –

    +0

    一般來說,如果awk能夠只處理一個awk處理副本,那麼使用awk比bash內置功能要好得多* awk在運行時比bash快得多,效率更高,但像每一個外部過程都需要時間來旋轉起來。當你開始運行一大堆小程序時,事情會變得混亂。 –

    回答

    1

    我認爲這是你想要做

    ... | awk -v f="$i" 'BEGIN{split(f,fs,"/")} $1=="chr17" {print > fs[8]}' 
    

    最終的文件名會由拆分原始文件名會產生什麼「/」和只使用第八段。有點不尋常,也許需要一些錯誤處理。

    沒有測試,概不退換......

    +0

    工作得很好 –

    2

    一個土生土長的bash實現(只是一個過程,而不是開始爲每一個文件的awk)如下:

    while IFS= read -r filename; do 
        while IFS= read -r line; do 
        if [[ $line = "chr17"[[:space:]]* ]]; then 
         IFS=/ read -r -a pieces <<<"$filename" 
         printf '%s\n' "${pieces[7]}" 
        fi 
        done < <(samtools depth "$filename") 
    done <dirlist 
    
    +0

    它確實厭倦了糾正使用'for'循環來讀取Bash中的行。感謝你如此不知疲倦。 – dawg