我正在尝试使用 printf 和 awk 来格式化一些输出。基本上,我希望最终格式看起来像这样(所有内容都以制表符分隔。)
chr10 100000624 100000625 10:100000625_A_G
chr10 100000644 100000645 10:100000645_A_C
chr10 100002463 100002464 10:100002464_C_T
chr10 100003241 100003242 10:100003242_G_T
chr10 100003303 100003304 10:100003304_A_G
chr10 10000337 10000338 10:10000338_C_T
chr10 100003515 100003516 10:100003516_A_G
chr10 100003784 100003785 10:100003785_C_T
chr10 100004359 100004360 10:100004360_A_G
chr10 100004440 100004441 10:100004441_C_G
...
起始文件如下所示(其他列不重要):
10:100000625_A_G G A
10:100000645_A_C C A
10:100002464_C_T C T
10:100003242_G_T G T
10:100003304_A_G G A
10:10000338_C_T T C
10:100003516_A_G A G
10:100003785_C_T C T
10:100004360_A_G A G
10:100004441_C_G C G ...
...
第二列应该比第一列少一个。使用我的原始文件,我基本上做到了:
awk -F ":" '$1=$1' OFS="\t" <(zcat <filename>) | awk -F "_" '$2=$2' OFS="\t" | awk -v OFMT="%f" 'BEGIN {OFS=FS="\t"} {print "chr"$1, $2-1, $2, $1":"$2"_"$3"_"$4}'
首先,我在开头的“:”处拆分了 id,然后是“_”处。我想我也可以同时awk -F "[:_]"...
使用这两个分隔符完成并拆分第一列,但我认为这在最后没有什么不同。
这是有效的,除了在少数情况下,该数字以科学记数法(如 12000000 之类的数字)报告,这是我不想要的。printf 应该能够让我撤销科学记数法,但我无法让它工作。
我的第一个想法是我想要第一列和第四列作为字符串,第二列和第三列作为没有小数的浮点数字。所以,我尝试了以下awk '{printf "%s\t%4.0f\t%4.0f\t%s\n" "chr"$1, $2-1, $2, $1":"$2"_"$3"_"$4}'
。但是,我收到以下错误消息:
awk: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
`%s %4.0f %4.0f %s
chr10'
^ ran out for this one
对于我的文件中有多少个字段,格式字符串似乎太长了,但我不确定为什么会这样。在玩弄 printf 时,我发现了一个特点。如果我这样做了awk '{printf "\t%s\t%4.0f\t%4.0f\t\n" "chr"$1, $2-1, $2, $1":"$2"_"$3"_"$4}'
,我会得到以下结果:
100000624 100000625 10
chr10 100000644 100000645 10
chr10 100002463 100002464 10
chr10 100003241 100003242 10
chr10 100003303 100003304 10
chr10 10000337 10000338 10
chr10 100003515 100003516 10
chr10 100003784 100003785 10
chr10 100004359 100004360 10
chr10 100004440 100004441 10
chr10
因此,第一列相对于所有其他列被向下推一行,第四列被截断。如果在您的回复中,您还可以解释您的 printf 语法是如何工作的,我将非常感激。非常感谢!
您只是在格式字符串后缺少一个逗号,例如
awk -F'[:_\t]' '{ printf "%s\t%4.0f\t%4.0f\t%s\n", "chr"$1, $2-1, $2, $1":"$2"_"$3"_"$4 }' file
# ^
# |
# this one
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句