我尝试将科学记数法中的所有数字从文件连接到一行。 输入(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")
}
}
}
。
答案 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测试该字段是否可以转换为数字,然后只测试字段中的e
或E
:
$ 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