2

这是对这个问题的跟进。我有这个固定宽度的文件,其中列宽是 34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 和 65。我想在删除第一列和最后一列后将其读入 R,其中第二列的值为“07”。感谢 Mat,如果我只想将 txt 文件转换为 csv,我可以使用以下代码来完成:

awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' </filepath/pipe.txt | cut --delimiter=',' --fields=2- > /filepath/parsed.csv

当然,然后我可以读入parsed.csv文件。但我试图用pipe(). 当我尝试在 R 中管道时,它挂起:

a = read.csv(pipe("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' 
                  </filepath/pipe.txt 
                  | cut --delimiter=',' --fields=2-")
             , header=F, colClasses="character")
4

2 回答 2

3

我不确定,pipe()但我会用system().

library(stringr)
txt <- system("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' < pipe.txt | cut --delimiter=',' --fields=2-", intern=T)
do.call(rbind, str_split(txt, ","))
于 2012-04-12T07:53:32.163 回答
0

jigr(和其他读者)——我在 R/RStudio 中发现了最奇怪的怪癖。只要没有换行符,我的问题中的代码就可以完美运行:

a = read.csv(pipe("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',''($2=='07'){ $1=$1 ''; print }' </filepath/pipe.txt | cut --delimiter=',' --fields=2-"), header=F, colClasses="character")

我不知道为什么会这样。

于 2012-04-12T08:22:29.273 回答