r - 使用 awk/bash 或 R 解析多行结果文本文件
问题描述
我正在尝试使用以下内容解析文本文件:
The MELTING results are :
Enthalpy : -181,100 cal/mol ( -756,998 J /mol)
Entropy : -467.3 cal/mol-K ( -1,953.31 J /mol-K)
Melting temperature : 75.13 degrees C.
The MELTING results are :
Enthalpy : -170,800 cal/mol ( -713,944 J /mol)
Entropy : -444 cal/mol-K ( -1,855.92 J /mol-K)
Melting temperature : 70.6 degrees C.
我正在尝试解析,以便每个条目得到一行,以焓(任何一个或两个)、熵(任何一个或两个)和熔化温度作为列。我尝试使用
awk '$1=="Enthalpy" {print $0}' file.txt > a
同样对于熵和熔化温度,并结合列并相应地解析。然而,我注意到,
awk '$1=="Enthalpy" {print $0}' file.txt | wc -l
结果 98181 和熵相似,但熔化温度为 92418。
独立组合这些值,我不知道缺少哪一个。有没有办法将所有这三个解析在一起,并为缺失的熔化温度提供 NA 或固定值?如果可能,使用 awk (bash)
解决方案
1)如果 R 标签意味着您想要一个 R 解决方案,并且假设您想要保留每行的第一个数字,那么为了说明这一点,我们将在末尾的注释中使用可重复生成的文件,其中我们添加了缺少字段的记录。
首先将其读入 2 列数据框,其中列 V1 和 V2 将The Melting ...
V1 字段替换为空字符串,并将 V2 中的第一个空格和之后的所有内容替换为空字符串。还要从 V2 中删除所有逗号。将它重新粘贴到一起,此时现在是 Debian 控制格式 (dcf)。现在阅读使用read.dcf
并将其转换为数字矩阵。(需要使用 to 的name=""
参数来textConnection
规避在长管道中出现的该函数中的错误。这在 r-devel 上进行了讨论,似乎它可能已经在 R 的开发版本中修复。)
不使用任何包。
"melting.txt" |>
read.table(sep = ":", strip.white = TRUE) |>
transform(V1 = sub("The MELTING.*", "", V1),
V2 = sub(" .*", "", gsub(",", "", V2))) |>
with(paste0(V1, ifelse(nchar(V1), ": ", ""), V2)) |>
textConnection(name = "") |>
read.dcf() |>
type.convert(as.is = TRUE)
给出这个数字矩阵:
Enthalpy Entropy Melting temperature
[1,] -181100 -467.3 75.13
[2,] -170800 -444.0 70.60
[3,] -181100 NA 75.13
[4,] NA -444.0 70.60
2)或者,混合 awk/R 解决方案如下。假设 melt.awk 在当前目录中并且包含:
# convert to dcf
BEGIN { FS = " : "; OFS = ": " }
/MELTING/ { print ""; next }
/:/ { sub(/^ */, "", $1); gsub(/ .*|,/, "", $2); print }
然后假设 gawk 在 PATH 上,从 R 运行它。(这可能也适用于 awk,但我只用 gawk 尝试过。)
"gawk.exe -f melting.awk melting.txt" |>
pipe() |>
read.dcf() |>
type.convert(as.is = TRUE)
笔记
Lines <- " The MELTING results are :
Enthalpy : -181,100 cal/mol ( -756,998 J /mol)
Entropy : -467.3 cal/mol-K ( -1,953.31 J /mol-K)
Melting temperature : 75.13 degrees C.
The MELTING results are :
Enthalpy : -170,800 cal/mol ( -713,944 J /mol)
Entropy : -444 cal/mol-K ( -1,855.92 J /mol-K)
Melting temperature : 70.6 degrees C.
The MELTING results are :
Enthalpy : -181,100 cal/mol ( -756,998 J /mol)
Melting temperature : 75.13 degrees C.
The MELTING results are :
Entropy : -444 cal/mol-K ( -1,855.92 J /mol-K)
Melting temperature : 70.6 degrees C."
cat(Lines, file = "melting.txt")
推荐阅读
- ruby-on-rails - 我希望从 read_replica DB 执行 Rails Admin Search
- css - 响应式 SVG 文本路径包装动态内容
- docker - 为什么我不能使用访问 Pod 资源和 GET 动词的服务帐户执行 `kubectl get pods --as=api-test -n default`?
- c# - 通过 msbuild 参数在 AssemblyInfo.cs 中设置 AssemblyInformationalVersion
- scala - 展平并从 Spark 中的 Struct 类型数据框列中读取值
- unreal-engine4 - 为世界生成放置演员时,我的虚幻引擎滞后
- vba - 圆弧
- oracle - Oracle 连接字符串空值
- java - 当我的 JFrame 加载时如何隐藏我的 JPanel?
- algorithm - 计算递归关系 T(n)=T(n / [(log n)^2]) + Θ(1)