我有一个包含9M行的表,snp_collection.tab
在几列中包含空值:
snpID freq_bin ID_nearest_gene ID_nearest_gene_located_within HGNC_nearest_gene_snpsnap HGNC_nearest_gene_snpsnap_protein_coding flag_snp_within_gene flag_snp_within_gene_protein_coding
10:10001753 7 ENSG00000224788 CELF2 FALSE FALSE
10:10001794 41 ENSG00000224788 CELF2 FALSE FALSE
10:100023489 10 ENSG00000138131 ENSG00000138131 LOXL4 LOXL4 TRUE TRUE
10:100025128 45 ENSG00000138131 ENSG00000138131 LOXL4 LOXL4 TRUE TRUE
10:10002975 1 ENSG00000224788 CELF2 FALSE FALSE
当我稍后使用awk
解析它以为我的目的生成更有用的表时,这会弄乱一些事情:
后一步从脏输入中搞砸了:
tail -n+2 broadSNPs.tab | gawk -F'[:\t]' -vOFS="\t" '{ print "chr"$1, ($2 - 1), $2, $3, $18, $19, $20, $21}' > broadSNPs.bed
这里,空格不受awk
的尊重,空格的行在输出中偏移。
所以,我试图在awk
之前填写这些空格。
使用此处提供的建议Filling space/tab separated, empty columns with 0,我已完成:
sed 's/\t\t/\tNA\t/g' snp_collection.tab > broadSNPs.tab
我还尝试用\t
替换ctrl+v+tab
,但是输出仍然与我原来的snp_collection.tab
相同,空格仍然只是空的
我错过了什么?谢谢!
期望的输出:
snpID freq_bin ID_nearest_gene ID_nearest_gene_located_within HGNC_nearest_gene_snpsnap HGNC_nearest_gene_snpsnap_protein_coding flag_snp_within_gene flag_snp_within_gene_protein_coding
10:10001753 7 ENSG00000224788 NA NA CELF2 FALSE FALSE
10:10001794 41 ENSG00000224788 NA NA CELF2 FALSE FALSE
10:100023489 10 ENSG00000138131 ENSG00000138131 LOXL4 LOXL4 TRUE TRUE
10:100025128 45 ENSG00000138131 ENSG00000138131 LOXL4 LOXL4 TRUE TRUE
10:10002975 1 ENSG00000224788 NA NA CELF2 FALSE FALSE
使用此固定输入,我的awk
命令不应产生无意义的输出。
答案 0 :(得分:2)
最简单的解决方案可能是告诉awk
单个标签(\t
)是字段分隔符:
默认行为是awk
将任何连续的空格视为字段分隔符:
echo -e "A\tB\t\tC\tD" | awk '{ print "c1="$1, "c2="$2, "c3="$3, "c4="$4, "c5="$5 }'
c1=A c2=B c3=C c4=D c5=
请注意awk
如何将两个连续的标签视为单个分隔符,即我们希望C
char为第4列,但它显示为第3列。
将单个标签指定为分隔符会导致第3列为空:
echo -e "A\tB\t\tC\tD" | awk -F'\t' '{ print "c1="$1, "c2="$2, "c3="$3, "c4="$4, "c5="$5 }'
c1=A c2=B c3= c4=C c5=D
有关详细信息,请参阅: