如何在R中读取linux进程状态(ps)命令的输出?
以下是data.txt文件:如何在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
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,或其他任何形式;),我没有捕捉到该部分,但现在您已经编辑了标题,我发现了问题……请使用在linuxps aux
中,您可以获得格式文件,\t
不能在这里使用。@KillKill-关于如何将ps aux
重定向到csv,可能值得一看这个问题:查看man ps
您可以指定输出格式。太棒了,避免任何外部文件-I/O!raw
是一个内置的、最好的to不要对其进行阴影处理,而是调用变量out
。