2015-05-30 105 views
1

我想比較文件的連續列並返回匹配元素的數量。我寧願使用shell腳本或awk。這裏是我嘗試使用的示例bash/AWK腳本。比較文件的連續列並獲取匹配元素的數量

#!/bin/bash 
for i in 3 4 5 6 7 8 9 

do 

    for j in 3 4 5 6 7 8 9 

    do 
    `awk "$i == $j" phased.txt | wc -l` 

    done 
done 

我有尺寸147189 * 828的一個文件,我要比較的每個列,並返回在828 * 828基體匹配的元素(A相似性矩陣)的數量。 這在MATLAB中相當容易,但是,加載大文件需要很長時間。我可以比較兩列,並與下面的awk命令返回匹配的元素個數:

awk '$3==$4' phased.txt | wc -l 

,但需要一些幫助做整個文件。

是我工作中的數據的一個片段是:

# sampleID HGDP00511 HGDP00511 HGDP00512 HGDP00512 HGDP00513 HGDP00513 

M rs4124251  0  0   A   G   0   A 

M rs6650104  0  A   C   T   0   0 

M rs12184279  0  0   G   A   T   0 

................................................................................ 

比較我將計算6 * 6矩陣在這種情況下,後:包含這些列的匹配百分比。

回答

0

在bash中,變量需要$才能解釋,因此您的awk "$i == $j" phased.txt | wc -l將被評估爲awk "3 == 4" phased.txt | wc -l;然後,由於你的反引號(`),shell會嘗試執行它作爲命令。爲了讓awk看到$3 == $4,您需要添加\$awk "\$$i == \$$j" phased.txt | wc -l

#!/bin/bash 
for i in 3 4 5 6 7 8 9  
do 
    for j in 3 4 5 6 7 8 9 
    do 
    awk "\$$i == \$$j" phased.txt | wc -l 
    done 
done 

雖然你可能會想顯示你正在評估其組合:

#!/bin/bash 
for i in 3 4 5 6 7 8 9  
do 
    for j in 3 4 5 6 7 8 9 
    do 
    echo "$i $j: $(awk "\$$i == \$$j" phased.txt | wc -l)" 
    done 
done 

其實你可以只是做計數AWK直接

#!/bin/bash 
for i in 3 4 5 6 7 8 9  
do 
    for j in 3 4 5 6 7 8 9 
    do 
    echo "$i $j: $(awk "\$$i == \$$j {count++}; END{print count}" phased.txt)" 
    done 
done 

最後,你可以只需在awk中完成整個事情;它幾乎肯定會更快,但說實話它並沒有那麼幹淨:[未測試]

#!/usr/bin/env awk -f 

{ 
    for (i = 3; i <= 9; i++) { 
     for (j = 3; j <= 9; j++) { 
      if ($i == $j) { 
       counts[i, j]++ 
      } 
     } 
    } 
} 

END { 
    for (i = 3; i <= 9; i++) { 
     for (j = 3; j <= 9; j++) { 
      printf "%d = %d: %d\n", i, j, counts[i, j] 
     } 
    } 
} 
+0

非常感謝,凱文!這運行順利:) 我試圖$$,但你''$'做了伎倆!非常感激。 – peacefrog

+0

很高興幫助。如果你沒有弄清楚,'$$'是shell的PID。 – Kevin

相關問題