首页 > 解决方案 > 使用 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)

标签: rawk

解决方案


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")

推荐阅读