【问题标题】:How to read output from linux process status (ps) command in R?如何从 R 中的 linux 进程状态(ps)命令读取输出?
【发布时间】:2013-01-04 02:51:13
【问题描述】:

这里是data.txt:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  
root         1  0.0  0.0   2280   728 ?        Ss   20:44   0:00 init [2]    
root         2  0.0  0.0      0     0 ?        S    20:44   0:00 [kthreadd]  
root       202  0.0  0.0      0     0 ?        S<   20:44   0:00 [ext4-dio-unwri  
root       334  0.0  0.1   2916  1452 ?        Ss   20:44   0:00 udevd --daemon  

如何将数据读入 data.frame?
1.不能决定分隔符
最后一个字段有问题,space不能做分隔符,
init [2] ,udevd --daemon 是一个字段,不能用space分隔。
2.没有固定宽度
每条线都有不同的宽度。

那么,我怎样才能将 data.txt 读入 data.frame?

【问题讨论】:

  • 你确定这里没有固定宽度吗?除了最后一列之外,这似乎是固定宽度。
  • 我可以阅读您通过read.fwf("data.txt", widths = c(4, 10, 5, 5, 7, 6, 4, 10, 6, 7, 20), skip = 1) 提供的这个示例。无法让标题工作,这就是我有skip = 1 的原因,但这些很容易添加。最后一个宽度可以设置得比你预期的要大得多,你应该没问题......我想...... .
  • @AnandaMahto - 我认为使用read.fwf 会出现问题,因为用于生成此文本的ps linux 命令将在每次运行时使用不同大小的列,具体取决于所需的值被打印。我在下面评论说,但是可以在使用程序时手动指定输出格式。
  • @thelatemail 或 Thela 或其他任何名称 ;),我没听懂那部分,但现在你已经编辑了标题,我看到了问题......跨度>

标签: r memory io system text-formatting


【解决方案1】:

您的数据是什么格式的?如果您可以在 Excel 中打开它,将其保存为制表符分隔文件很可能是前进的最佳方式。

将文件另存为制表符分隔文件是准备数据以导入R 的更常见方法之一。这可以通过“另存为”“.txt(制表符分隔)”在 Excel 中完成。完成后:

my_data <- read.table("path/to/file/", header = TRUE, sep = "\t")

sep = "\t" 告诉 R 你的文件是制表符分隔的

【讨论】:

  • 请在linux下使用命令ps aux,可以得到格式文件,\t这里不能使用。
  • @KillKill - 关于如何将ps aux 重定向到 csv 的问题可能值得一看:stackoverflow.com/questions/3114741/… 查看man ps,您可以指定输出格式。
【解决方案2】:

这是一个可以解决问题的单行:

do.call(rbind, lapply(strsplit(readLines("data.txt"), "\\s+"), function(fields) c(fields[1:10], paste(fields[-(1:10)], collapse = " "))))

这是它的详细操作:

  1. 通过readLines 读取文件的所有行(产生一个字符向量,其中每个向量元素都是文件的一行)

  2. 使用strsplit 将每行拆分为由空格分隔的字符串 (\\s+)

  3. 对于每一行(lapply),将第 10 个字段之后的所有字段合并为一个(通过paste(..., collapse = " "))---这将创建一个列表,其中每个列表元素代表文件的一行,并且是长度为 11 的字符向量(每个字段一个)

  4. 最后,调用rbind将列表合并为矩阵(或数据框)

【讨论】:

    【解决方案3】:

    我会这样做:

    library(stringr) # has a convenient function for splitting to a fixed length 
    
    raw          <- system("ps aux", intern = TRUE)
    fields       <- strsplit(raw[1], " +")[[1]]
    ps           <- str_split_fixed(raw[-1], " +", n = length(fields))
    colnames(ps) <- fields
    

    【讨论】:

    • 太棒了,避免了任何外部文件 I/O! raw 是 R 内置的,最好不要隐藏它,而是调用变量 out
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2012-06-30
    • 2018-12-17
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多