awk printf文件中的特定列

时间:2016-09-19 15:56:22

标签: awk

我想用科学记数法打印我文件的特定列(在本例中为第7列),而其余列按原样打印。

如何仅针对第7列有选择地使用printf,为前6列选择print

示例输入:

C   6   12.011  0.51    3.56E-01    4.60E-01    0.458399
CA  6   12.011  -0.15   3.55E-01    2.93E-01    0.291708
CAI 6   12.011  -0.25   3.55E-01    3.05E-01    0.30421
CC  6   12.011  0.62    3.56E-01    2.93E-01    0.291708

期望的输出:

C   6   12.011  0.51    3.56E-01    4.60E-01    4.58E-01
CA  6   12.011  -0.15   3.55E-01    2.93E-01    2.92E-01
CAI 6   12.011  -0.25   3.55E-01    3.05E-01    3.04E-01
CC  6   12.011  0.62    3.56E-01    2.93E-01    2.92E-01

2 个答案:

答案 0 :(得分:2)

您可以使用sprintf

$ awk -v OFS="\t" '{ $7 = sprintf("%.2E", $7) }1' input.txt
C   6   12.011  0.51    3.56E-01    4.60E-01    4.58E-01
CA  6   12.011  -0.15   3.55E-01    2.93E-01    2.92E-01
CAI 6   12.011  -0.25   3.55E-01    3.05E-01    3.04E-01
CC  6   12.011  0.62    3.56E-01    2.93E-01    2.92E-01

答案 1 :(得分:0)

仅更改最后一列而不影响其他字段的间距:

$ cat ip.txt 
C   6   12.011  0.51    3.56E-01    4.60E-01    0.458399
CA  6   12.011  -0.15   3.55E-01    2.93E-01    0.291708
CAI 6   12.011  -0.25   3.55E-01    3.05E-01    0.30421
CC  6   12.011  0.62    3.56E-01    2.93E-01    0.291708

$ perl -pe 's/\S+$/sprintf "%.2E", $&/e' ip.txt 
C   6   12.011  0.51    3.56E-01    4.60E-01    4.58E-01
CA  6   12.011  -0.15   3.55E-01    2.93E-01    2.92E-01
CAI 6   12.011  -0.25   3.55E-01    3.05E-01    3.04E-01
CC  6   12.011  0.62    3.56E-01    2.93E-01    2.92E-01

如果需要其他一些栏目:

$ perl -pe 's/^(\S+\s+){2}\K\S+/sprintf "%.2E", $&/e' ip.txt 
C   6   1.20E+01  0.51    3.56E-01    4.60E-01    0.458399
CA  6   1.20E+01  -0.15   3.55E-01    2.93E-01    0.291708
CAI 6   1.20E+01  -0.25   3.55E-01    3.05E-01    0.30421
CC  6   1.20E+01  0.62    3.56E-01    2.93E-01    0.291708
相关问题