打印科学记数字

时间:2017-02-11 12:53:28

标签: linux awk sed

我尝试将科学记数法中的所有数字从文件连接到一行。 输入(test_sc.txt)

1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00

期望的输出:

awk 'BEGIN {k=""}; {for (i=1; i<=NF; i++) {if ($i ~ (/e-/ || /e\+/)) {k=k$i" ";}}}; END {print k}' "test_sc.txt"

当前的awk命令:

1e+03 1e-03 

当前输出:

/e/

好的,如果我将模式更改为february它可以正常工作,但也会打印print $i

如果我将awk添加到awk命令,则所有数字都会正确打印。但是,据我所知,gawk 4.0在处理数字时会在内部更改表示法。我该如何阻止它?

awk(linux),something similar is described here,但他们没有解释行为并建议更改sed

看来,在处理字符串而不是数字时,任务更容易解决。如果它与awk混淆,我会尝试def requestPayload(): String = ??? //do something @Singleton class SimpleCache @Inject() () { lazy val result: Future[String] = requestPayload() } //Usage @Singleton class SomeController @Inject() (simpleCache: SimpleCache) { def action = Action { req => simpleCache.result.map { result => Ok("success") } } }

5 个答案:

答案 0 :(得分:1)

您可以使用-o grep选项,然后输入xargs以获取所有结果:

$ grep -Eo '\S+e[-+]\S+' file | xargs 
1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00

答案 1 :(得分:1)

考虑以下方法:遍历所有字段并检查字段 匹配科学计数法中数字的特定正则表达式模式 /([0-9]+\.)?[0-9]+e[+-][0-9]+/

awk '{for(i=1;i<=NF;i++){ if($i~/^([0-9]+\.)?[0-9]+e[+-][0-9]+$/){ print $i} }}' test_sc.txt

输出:

1e+03
1e-03
3.39e+03
2.834967e+02
0.000000e+00

答案 2 :(得分:1)

使用GNU awk进行多字符RS,如果你不关心最后一个空白字符而没有终止换行:

$ awk -v RS='\\s' -v ORS=' ' '$0==($0+0) && /e/' file
1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00

以上只是测试每个值是否为数字(即它等于自身加零)并且包含e,如果是,则打印它。如果您确实要删除尾随空白字符并添加终止换行符,您可以按摩至:

$ awk -v RS='\\s' '$0==($0+0) && /e/{s = (s=="" ? "" : s OFS) $0} END{print s}' file
1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00

答案 3 :(得分:0)

一对括号内的两个模式出了问题。这有效:

awk 'BEGIN {k=""}; {for (i=1; i<=NF; i++) {if (($i ~ /e-/) || ($i ~ /e\+/)) {k=k$i" ";}}}; END {print k}' "test_sc.txt"

改进,如@iiSeymour在评论中所建议的那样:

awk '{for (i=1;i<=NF;i++) if ($i~/e[-+]/){k=(k?k OFS $i:$i)}}END{print k}'

答案 4 :(得分:0)

您可以使用awk测试该字段是否可以转换为数字,然后只测试字段中的eE

$ awk '{ for (i=1;i<=NF;i++) if ($i+0==$i && $i ~ /e|E/) s=s $i FS} 
       END { if (s) print s }' /tmp/file
1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00 

或者,为了避免END阻止:

$ awk -v ORS=' ' '{ for (i=1;i<=NF;i++) if ($i+0==$i && $i ~ /e|E/) print $i}' /tmp/file
1e+03 1e-03 3.39e+03 2.834967e+02 0.000000e+00