我想用科学记数法打印我文件的特定列(在本例中为第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
答案 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