Awk Grep特定列、计数和写入输出文件

Awk Grep特定列、计数和写入输出文件,awk,grep,text-processing,Awk,Grep,Text Processing,我试图总结我的数据并计算具体项目 这些是人类测序数据,因此非常大 #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NORMAL PRIMARY 1 12867 . C A 5 q40;bldp;blq SS=1;VT=S

我试图总结我的数据并计算具体项目

这些是人类测序数据,因此非常大

#CHROM  POS   ID    REF  ALT    QUAL    FILTER      INFO          FORMAT                            NORMAL                                          PRIMARY
  1    12867  .     C    A       5  q40;bldp;blq    SS=1;VT=SNP;  GT:DP:AD:BQ:MQ:SB:FA:SS:SSC:MQA   1/0:8:7,1:36,39:0:0.0,0.0:0.125:0:5:14.9,16.0   1/0:2:2,0:33,0:0:0.0,0:0.0:1:5:16.0,0
为了简化,数据如下所示

column1 column2 column3 column4 column5 column6 column7  column8   column9 column10                                         column11
   x      x      x        x       x        x      x       SS=1       x     1/0:8:7,1:36,39:0:0.0,0.0:0.125:0:5:14.9,16.0    1/0:2:2,0:33,0:0:0.0,0:0.0:1:5:16.0,0
   x      x      x        x       x        x      x       SS=2       x     1/0:8:7,1:36,39:0:0.0,0.0:0.125:0:5:14.9,16.0    1/0:2:2,0:33,0:0:0.0,0:0.0:1:5:16.0,0
首先,我需要计算第8列中有多少不同的SS。共有5种不同类型的SS,即SS=1。。。。。SS=5。 这可以通过grep命令和 我试过了

grep SS=1 file1.vcf | wc -l
grep SS=2 file1.vcf | wc -l
然后我想计算第10列和第11列中第7个冒号(:)后面的位置有多少个“0”、“1”、“2”

这是我不知道该怎么做的部分。我正在考虑使用awk,但我不确定如何指定在特定位置查找(在第7个冒号(:)之后)

我有246个文件,我想做完全相同的。我如何应用到我所有的文件和写在txt文件的计数?我只知道如何做一个接一个,也许我可以猫计数文件在最后

for f in *.vcf; do grep SS=1 "$f" | wc -l > ${f}SS1.txt; done

要计算第8列中的不同值,可以使用典型方法:

$ awk -F"\t" 'NR>1{a[$8]++} END{for (i in a) print i,a[i]}' file
SS=1 1
SS=2 1

要计算
-从第10个和第11个字段中分离的字符串的第8个位置有多少不同的值,可以使用
split()
将字符串分块。然后,使用与上面相同的方法

$ awk -F"\t" 'NR>1{split($10,a,":"); split($11,b,":"); count10[a[8]]++; count11[b[8]]++} END {for (i in count10) print i, count10[i]; for (i in count11) print i, count11[i]}' a
0 2
1 2
您可以将所有内容放在一起,得到如下内容:

$ awk -F"\t" 'NR>1{count8[$8]++; split($10,a,":"); split($11,b,":"); count10[a[8]]++; count11[b[8]]++} END {for (i in count8) print i, count8[i]; for (i in count10) print i, count10[i]; for (i in count11) print i, count11[i]}' file
SS=1 1
SS=2 1
0 2
1 2

如果您想对许多文件执行此操作,您可以使用循环或更好地使用
FILENAME
ENDFILE
刷新存储的信息。尝试一下,如果您遇到任何问题,请告诉我们。

如果您/我们不关心前7列中的值,为什么要向我们显示它们?请举例说明尽可能简洁和简单-您要求我们在帮助您方面付出的努力越少,我们就越有可能帮助您。根据您的示例输入显示预期输出。
$ awk -F"\t" 'NR>1{count8[$8]++; split($10,a,":"); split($11,b,":"); count10[a[8]]++; count11[b[8]]++} END {for (i in count8) print i, count8[i]; for (i in count10) print i, count10[i]; for (i in count11) print i, count11[i]}' file
SS=1 1
SS=2 1
0 2
1 2