Awk 对于字段中的每个唯一引用,将另一个字段中的每个唯一引用转换为不同列
我有一份档案Awk 对于字段中的每个唯一引用,将另一个字段中的每个唯一引用转换为不同列,awk,Awk,我有一份档案 splice_region_variant,intron_variant A1CF 1 3_prime_UTR_variant A1CF 18 intron_variant A1CF 204 downstream_gene_variant A1CF 22 synonymous_variant A1CF 6 missense_variant A1CF 8 5_prime_UTR_variant A2M
splice_region_variant,intron_variant A1CF 1
3_prime_UTR_variant A1CF 18
intron_variant A1CF 204
downstream_gene_variant A1CF 22
synonymous_variant A1CF 6
missense_variant A1CF 8
5_prime_UTR_variant A2M 1
stop_gained A2M 1
missense_variant A2M 15
splice_region_variant,intron_variant A2M 2
synonymous_variant A2M 2
upstream_gene_variant A2M 22
intron_variant A2M 308
missense_variant A4GNT 1
intron_variant A4GNT 21
5_prime_UTR_variant A4GNT 3
3_prime_UTR_variant A4GNT 7
此文件按$2
对于$2
中出现的每个唯一元素,我想在列中转换$1
中出现的每个唯一元素,并在$3
或0
中转换相应的值(如果不存在记录)。因此,我:
splice_region_variant,intron_variant 3_prime_UTR_variant intron_variant downstream_gene_variant synonymous_variant missense_variant 5_prime_UTR_variant stop_gained upstream_gene_variant
A1CF 1 18 204 22 6 8 0 0 0
A2M 2 0 308 0 2 15 1 1 22
A4GNT 0 7 21 0 0 22 3 0 0
测试文件:
a x 2
b,c x 4
dd x 3
e,e,t x 5
a b 1
cc b 2
e,e,t b 1
这就是我得到的:
a b,c dd e,e,t cc
x 5 2 4 3
b 1 2 1
编辑:这可能正在执行,但不会在空白字段中输出0
s
'BEGIN {FS = OFS = "\t"}
NR > 1 {data[$2][$1] = $3; blocks[$1]}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
# header
printf "gene"
for (block in blocks) {
printf "%s%s", OFS, block
}
print ""
# data
for (ts in data) {
printf "%s", ts
for (block in blocks) {
printf "%s%s", OFS, data[ts][block]
}
print ""
}
}' file
修改自如果要打印
0
如果缺少某个值,可以执行以下操作:
val = data[ts][block] ? data[ts][block] : 0;
printf "%s%s", OFS, val
请指定您一直面临的错误以及您试图解决的问题。另外,您发布的代码越少,就越有可能有人会查看它——因此我建议尝试创建一个较小的示例。谢谢您的建议。更新到我最近的测试和示例文件。