sed:用NA替换空列

时间:2018-05-03 16:45:39

标签: awk sed bioinformatics text-processing text-parsing

我有一个包含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

为简单起见,看起来像这样:enter image description here

当我稍后使用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命令不应产生无意义的输出。

1 个答案:

答案 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

有关详细信息,请参阅:

https://stackoverflow.com/a/30406868/1515117