使用 printf 和 AWK 正确格式化我的输出

我正在尝试使用 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用printf格式化数组的输出

来自分类Dev

如何使用printf和对话框格式化输出?

来自分类Dev

使用awk格式化nstats的输出

来自分类Dev

使用 awk 格式化输出

来自分类Dev

awk变量和printf

来自分类Dev

使用浆糊和awk实时格式化sar样本

来自分类Dev

我如何在java中使用printf来打印格式化输出

来自分类Dev

在bash脚本中使用printf格式化输出

来自分类Dev

使用printf在Java中格式化输出

来自分类Dev

使用printf格式化输出:截断或填充

来自分类Dev

使用通过xargs传递的printf格式化输出

来自分类Dev

AWK命令使用自定义记录分隔符和字段分隔符格式化文本输出

来自分类Dev

如何使用cout格式化语句以正确的格式打印输入和输出?

来自分类Dev

将先前命令(管道)中的参数传递给awk / printf函数并格式化输出

来自分类Dev

使用sed / awk / grep格式化git日志输出

来自分类Dev

使用awk sed格式化输出日志文件

来自分类Dev

使用awk格式化输出中的列

来自分类Dev

使用_Generic进行printf格式化

来自分类Dev

使用Promela和SPIN输出printf?

来自分类Dev

使用Promela和SPIN输出printf?

来自分类Dev

使用awk或sed进行数据清理和格式化

来自分类Dev

使用 unix 命令和 awk 重新格式化表(groupby)

来自分类Dev

使用php和mysql格式化输出

来自分类Dev

使用 setw 和 setfill 进行输出格式化

来自分类Dev

awk,printf和变量中的方程

来自分类Dev

格式化awk输出

来自分类Dev

使用laravel和carbon正确格式化日期时间

来自分类Dev

使用 jQuery 和 AJAX 正确格式化表格

来自分类Dev

使用awk格式化文本