2012-04-12 165 views
2

这是this问题的后续行动。我有this固定宽度的文件,其中列宽是34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2和65.我想在读取第一列和最后一列之后读入R,其中第二列的值为“07”。由于太,如果我只是想txt文件到CSV转换,我可以用这个代码做到这一点:。管道unix命令

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

请不要将已解决的问题添加到您的标题中,但请勾选正确的答案......另外,您可能希望将您的名称从默认生成的名称更改为更具意义的名称(但这仅仅是我的意见)。 – 2012-04-12 08:47:42

+0

保罗,我补充说“解决了”,因为没有“正确的”答案。问题本身就是问题,我自己偶然发现了这种认识。请参阅下面的避难所注释。 – user702432 2012-04-13 06:31:23

+0

我了解情况。我建议你编辑你的答案,包括解决你的问题的描述,并接受这个答案。这在SO上完全可以接受。 – 2012-04-13 06:52:59

回答

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

我没有丝毫的想法,为什么会发生这种情况。

+0

这是壳的工作方式。你也可以移动'|' char up,它会起作用,因为shell的解析器期望这个命令在下一行继续。说到继续,你也可以在第一行末尾使用'\'(没有单引号)。它通常被称为延续字符,并且必须是行中的最后一个字符,它将会把事情弄糟。祝你好运。 – shellter 2012-04-12 13:44:02

+0

好吧,我生活和学习。感谢提示,避难所。 – user702432 2012-04-13 06:26:33