Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中读取linux进程状态(ps)命令的输出?_R_Memory_Io_System_Text Formatting - Fatal编程技术网

如何在R中读取linux进程状态(ps)命令的输出?

如何在R中读取linux进程状态(ps)命令的输出?,r,memory,io,system,text-formatting,R,Memory,Io,System,Text Formatting,以下是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

以下是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  
USER PID%CPU%MEM VSZ RSS TTY STAT START TIME命令
根1 0.0 0.0 2280 728?Ss 20:44 0:00初始[2]
根2 0.0 0.0?S 20:44 0:00[K线程]
根202 0.0 0.0?S<20:44 0:00[ext4 dio Unwi
根目录334 0.0 0.1 2916 1452?Ss 20:44 0:00 udevd--守护进程
如何将数据读入数据框?
1.无法决定分隔符
最后一个字段有问题,
空格
不能作为分隔符,
init[2],udevd——守护进程是一个字段,不能用
空格分隔
2.无固定宽度
每行都有不同的宽度


那么,如何将data.txt读入data.frame?

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

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

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

my_data我会这样做:

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
library(stringr)#有一个方便的功能,可以拆分为固定长度

raw这里有一个单行程序可以实现这一目的:

do.call(rbind, lapply(strsplit(readLines("data.txt"), "\\s+"), function(fields) c(fields[1:10], paste(fields[-(1:10)], collapse = " "))))
这就是它所做的详细工作:

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

  • 使用
    strsplit
    将每一行分割成由空格分隔的横线(
    \\s+

  • 对于每一行(
    lappy
    ),将第10个字段之后的所有字段合并为一个(通过
    paste(…,collapse=”“)
    )——这将创建一个列表,其中每个列表元素表示文件的一行,是长度为11的字符向量(每个字段一个)

  • 最后,调用
    rbind
    将列表合并到矩阵(或数据帧)中


  • 你确定这里没有固定宽度吗?除了最后一列之外,这似乎是固定宽度。我可以阅读你提供的这个示例,它带有
    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命令t每次运行时都会使用不同大小的列,具体取决于需要打印的值。我在下面说过,在使用该程序时可以手动指定输出格式。@thelatemail,或Thela,或其他任何形式;),我没有捕捉到该部分,但现在您已经编辑了标题,我发现了问题……请使用在linux
    ps aux
    中,您可以获得格式文件,
    \t
    不能在这里使用。@KillKill-关于如何将
    ps aux
    重定向到csv,可能值得一看这个问题:查看
    man ps
    您可以指定输出格式。太棒了,避免任何外部文件-I/O!
    raw
    是一个内置的、最好的to不要对其进行阴影处理,而是调用变量
    out