管道unix命令

时间:2012-04-12 07:38:26

标签: r unix

这是对this问题的跟进。我有this固定宽度文件,其中列宽为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")

2 个答案:

答案 0 :(得分: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, ","))

答案 1 :(得分: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")

我没有丝毫想到为什么会这样。