首页 > 解决方案 > 使用 awk 在文件末尾添加常量值作为列

问题描述

我想在 bash 文件的每一行末尾添加一个具有恒定值的列,同时选择列,进行数学运算,并将字段分隔符(从我认为只是制表符)更改为空格。

我的输入文件:

10:100968448:T:AA       0.3519  10      100968448       t       aa      1.0024  0.01    0.812
10:101574552:A:ATG      0.4493  10      101574552       a       atg     0.98906 0.0097  0.2585
10:102244152:A:AG       0.2008  10      102244152       a       ag      0.996705        0.0114  0.7701
10:102290698:A:AG       0.1899  10      102290698       a       ag      0.993024        0.0114  0.5431
10:104999458:T:TG       0.3449  10      104999458       t       tg      0.956763        0.0101  1.149e-05

如果我将常量放在倒数第二列:

awk -v OFS=" " 'BEGIN { FS = "\t" } ;  {print $1, $5, $6, log($7)/log(10), '105318', $9}' input

有用:

10:100968448:T:AA t aa 0.00104106 105318 0.812
10:101574552:A:ATG a atg -0.00477736 105318 0.2585
10:102244152:A:AG a ag -0.00143336 105318 0.7701
10:102290698:A:AG a ag -0.00304026 105318 0.5431
10:104999458:T:TG t tg -0.0191956 105318 1.149e-05

但是当我尝试将常量放在文件末尾时,我需要它:

awk -v OFS=" " 'BEGIN { FS = "\t" } ;  {print $1, $5, $6, log($7)/log(10), $9, '105318'}' input

它并没有真正起作用(它将常量添加到第一个字段):

 10531868448:T:AA t aa 0.00104106 0.812
 10531874552:A:ATG a atg -0.00477736 0.2585
 10531844152:A:AG a ag -0.00143336 0.7701
 10531890698:A:AG a ag -0.00304026 0.5431
 10531899458:T:TG t tg -0.0191956 1.149e-05

我什至尝试使用它工作的文件,改组列,并将常量随机添加到某个地方......我在这个文件上使用了dos2unix,认为其中可能有一些奇怪的字符,但问题仍然存在。当我使用逗号作为输出字段分隔符时,我看到在文件末尾生成了多个逗号(当我尝试将常量作为最后一列包含时)。

为了澄清,所需的输出:

10:100968448:T:AA t aa 0.00104106 0.812 105318 
10:101574552:A:ATG a atg -0.00477736 0.2585 105318 
10:102244152:A:AG a ag -0.00143336 0.7701 105318 
10:102290698:A:AG a ag -0.00304026 0.5431 105318 
10:104999458:T:TG t tg -0.0191956 1.149e-05 105318 

有任何想法吗?

标签: bashshellawkcarriage-return

解决方案


您的输入文件有 dos 行结尾。dos2unix使用或类似工具删除回车符。

您看到的输出是$9awk 中的字段具有回车符,因此当您添加字段时,光标会在打印最后一个字段之前移动到行首。

10:100968448:T:AA t aa 0.00104106 105318 0.812<CR> 105318

CR 在打印时将光标位置移动到行首,因此您会看到:

 10531868448:T:AA t aa 0.00104106 105318 0.812

推荐阅读