2015-05-30 58 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

相关问题