使用awk在文件末尾添加常量值作为列

Adding constant value as column at the end of file using awk

我想在 bash 文件的每一行末尾添加一个具有常量值的列,同时选择列、进行数学运算并更改字段分隔符(根据我的想法只是制表符)到 space.

我的输入文件:

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 , , , log()/log(10), '105318', }' 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 , , , log()/log(10), , '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 

有什么想法吗?

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

您看到的输出是 awk 中的 </code> 字段具有回车 return 字符,因此当您添加字段时,光标会在打印最后一个之前移动到行首场.</p> <pre><code>10:100968448:T:AA t aa 0.00104106 105318 0.812<CR> 105318

CR打印时把光标位置移到行首,所以你看:

 10531868448:T:AA t aa 0.00104106 105318 0.812

能否请您尝试以下。

awk '{print ,,,log()/log(10),$NF,105318}' Input_file

如果您根据 Kamil 的回答控制了 M 个字符,那么 运行 以下。

awk '{gsub(/\r/,"");print ,,,log()/log(10),$NF,105318}' Input_file