Grep 特定列、计数和写入输出文件
Grep specific columns, count and write output file
我正在尝试汇总我的数据并对特定项目进行计数
这些是人类测序数据,因此非常大。
#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
首先,我需要计算column8中有多少不同的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 个冒号 (:)
之后
awk -F ':' '==1' #this does command only specifies column but not at specific position.
我有 246 个文件要完全相同。如何应用到我的所有文件并将计数写入 txt 文件?我只知道一个一个做,最后可能能把count文件cat一下。
for f in *.vcf; do grep SS=1 "$f" | wc -l > ${f}SS1.txt; done
要计算第 8 列中有多少个不同的值,您可以使用典型方法:
$ awk -F"\t" 'NR>1{a[]++} 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(,a,":"); split(,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[]++; split(,a,":"); split(,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
来刷新存储的信息。尝试一下,如果您遇到任何问题,请告诉我们。
我正在尝试汇总我的数据并对特定项目进行计数
这些是人类测序数据,因此非常大。
#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
首先,我需要计算column8中有多少不同的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 个冒号 (:)
之后awk -F ':' '==1' #this does command only specifies column but not at specific position.
我有 246 个文件要完全相同。如何应用到我的所有文件并将计数写入 txt 文件?我只知道一个一个做,最后可能能把count文件cat一下。
for f in *.vcf; do grep SS=1 "$f" | wc -l > ${f}SS1.txt; done
要计算第 8 列中有多少个不同的值,您可以使用典型方法:
$ awk -F"\t" 'NR>1{a[]++} 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(,a,":"); split(,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[]++; split(,a,":"); split(,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
来刷新存储的信息。尝试一下,如果您遇到任何问题,请告诉我们。