我有一个如下的数据文件..
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 ..
我已经尝试了很多来解决这个问题并来到这里寻求建议。
答案 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