在文件的每一列上迭代命令

时间:2015-07-28 17:36:29

标签: bash awk

我有一个如下的数据文件..

N A C T C C G G T G T C G G T C T C G T A G G C C A T T T T A G A A G C G A A T A A A T C G A T G N A T T C G A N C N C N N N N N N N N A T C G N N A G A G C T C G T A N G C C G T C T T C T G C T T G A 
N T C T A C G G T G T C G G T C T C G T A G C C T A T C G G G T A G C A G A G C T T A T C G A T G A A T T C G A G C T C G G T T T C A G A T T G G C A G A G C T C G T A N T G C G G C C T T C G G C T G A 
N G T T A C G G T G T C G G T C T C G T A G T G A G T T G A C C T C C G C C C A G T A T C G A T G A A T T C G A G C T C G T T T T C A G A T C G G A A G A G C T C G T C N G C C G T C T T C T G C T T G A 
N A G A T C G G T G T C G G T C T C G T A G A T G A T C T G G C A A T A G C G C C C A T C G A T G A A T T C G A G C T C G T T T T C A G A T C G G A A G A G C T C G T A N G C G G T C T T C T C C T T G A

我想在文件的每一列上迭代一个命令。那是

awk '{h[$1]++};END{for (k in h)print k, h[k]}' sample2.fa | sort -r -n -k2

输出文件就像

 N 4  A 2 ..
      T 1 ..
      G 1  ..

我已经尝试了很多来解决这个问题并来到这里寻求建议。

2 个答案:

答案 0 :(得分:1)

Double awk数组将完成这项工作,但最终格式化

除外
awk '{for(i=1;i<=NF;i++) {a[i,$i]++; codes[$i]=1} } END{for(i=1;i<=NF;i++) for(c in codes) if((i,c) in a) print i, c, a[i,c]}'

你得到,第一个数字是列号,

1 N 4
2 A 2
2 G 1
2 T 1
3 C 2
3 G 1
3 T 1
4 A 1
4 T 3

您可以通过管道排序以获得所需的订单

... | sort -k1n -k3nr

这里按升序排列第一个值,第三个值按降序排序。

答案 1 :(得分:1)

此脚本使用awk计算输入文件中的所有字母,sort执行两轮排序,然后再awk格式化输出:

#!/bin/sh
awk '
{
  for (i = 1; i <= NF; i++) {
    l[$i]++;
    a[i, $i]++;
    if (NF > n) {n = NF};
  }
}
END{
  for (i = 1; i <= n; i++) {
    for (j in l) {
      if (a[i, j] > 0) {print i, j, a[i, j]};
    }
  }
}
' sample.fa | sort -k 3 -n -r | sort -k 1 -n -s |\ 
awk '
{
  col=$1;
  a[col]++;
  row = a[col];
  l[col, row] = $2;
  n[col, row] = $3;
  if (maxCol < col) {maxCol = col};
  if (maxRow < row) {maxRow = row};
}
END {
  for (row = 1; row <= maxRow; row++) {
    for (col = 1; col <= maxCol; col++) {
      printf "%s\t%s\t", l[col, row], n[col, row];
    }
    printf "\n";
  }
}'

输出(来自样本输入的前10个字母):

N 4 A 2 C 2 T 3 A 2 C 4 G 4 G 4 T 4 G 4 
    T 1 T 1 A 1 T 1           
    G 1 G 1     C 1