这是对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")
答案 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")
我没有丝毫想到为什么会这样。