2014-02-26 34 views
0

我如何保存數據是在AWK報表打印出來?爲了能夠訪問變量或數組?每個文件都有4個值(GATC)以及它們的總和。如果找到符合文件標準的每行,則迭代並打印每行,並添加每行總共找到四行的每行的數量。我需要稍後訪問信息。雖然它不一定是線條,但我不需要。我怎樣才能保存成一個數組我會認爲是最好的方式來做到這一點?慶典AWK節省什麼是被輸出到陣列

for f in $FILES 
do 
     [ -d "$f" ] && continue 

     if is_file_contains_DNA $f; then 
      echo "DNA exist in " $f >> $SUMMARYPATH 
     #touch $OUTFILENAME$f 
     awk '/^ATOM/&&substr($0,20,1)~/[GATC]/{print;l++;a[substr($0,20,1)]++}END{printf "total line : %s\n",l;for (i in a) printf "%s : %s \n",i,a[i]}' $f >> $RESULTSPATH$OUTFILENAME$f 
     else 
      echo "DNA DOES NOT exist in "$f >> $SUMMARYPATH 
     fi 

done 

其他想法:

有可能是一個簡單的解決方案。我可以使用「awk」而不是一個來打印兩個文件嗎?所以我想打印我現在有的結果文件,然後添加到單個「SUMMARY」文件,就像我在awk之前的行一樣?

+0

'陣列=($(awk命令) )'? –

+0

我不想在每次全系列的數據,只是如果是有道理的標準迭代的櫃檯?它尋找的GATC和每一個命中,我想添加到櫃檯,並跟蹤和我想添加到數組列表中的每個文件。所以第一個數組[1]將有每個GATC總量和總所有的人......第二個數組[2]將需要的文件2,依此類推... – MAXGEN

回答

0

您可以嘗試在bash陣列中使用的文件描述符從awk內輸出一些東西到終端和捕捉其他數據。例如

#! /bin/bash 

exec 6>&1 

files=(file1 file2) 
res=() 
numfiles=${#files[@]} 

for ((i=0; i<$numfiles; i++)) ; do 
    res[$i]=$(awk -f a.awk "${files[$i]}") 
done 

exec 6>&- 

將打開與數字6,其將內awk可用一個新的文件描述符,所以awk腳本a.awk然後可以是:

/^ATOM/ && substr($0,20,1)~/[GATC]/ { 
    print > "/dev/fd/6" 
    l++ 
    a[substr($0,20,1)]++ 
} 
END { 
    printf ("total line : %s\n",l) > "/dev/fd/6" 
    printf "%s ", l 
    for (i in a) { 
     printf ("%s : %s \n",i,a[i]) > "/dev/fd/6" 
     printf "%s ",a[i] 
    } 
} 
+0

這看起來像一個可能的解決方案。我無法理解我將如何合併迭代,雖然每個循環?我之前用$ f作爲迭代器使用了「for」循環。可能有更簡單的解決方案。我可以使用「awk」而不是一個來打印兩個文件嗎?所以我想打印我現在有的結果文件,然後添加到單個「SUMMARY」文件。我更新我的問題並添加大部分代碼。 – MAXGEN

+0

@MAXGEN只需輸入概要文件名稱到命令行的awk,那麼你可以寫兩個文件。就像:'AWK -vsfile = 「$ SUMMARYPATH」 '/^ATOM/..' $ F >> $ RESULTSPATH $ OUTFILENAME $ F'。在awk腳本中,只需使用'print'xx >> >> sfile' –