在Windows机器上使用fread中的unix命令预处理文件

时间:2017-12-01 09:29:29

标签: r awk grep data.table

为避免将大型数据集(> 700万行)加载到R中,我希望对其进行预处理。目的是在grep包中的gawk中使用fread()data.table

以下是数据集(test.dat);

的一个非常简化的示例
0.678 324 765
8.001 109 425
4.425 765 124
3.463 425 765

我想在ID列2和3上匹配并返回第1列。尝试使用grep但没有成功;

library(data.table)
# id <- 425
fread("grep 425 test.dat", header = FALSE)
#       V1  V2  V3
# 1: 8.001 109 425
# 2: 4.425 765 124 # <-- incorrect match
# 3: 3.463 425 765

不,-w对网上不同地方的建议没有帮助,因为十进制被视为标记单词结尾的标点符号。

然后我在Windows 10计算机上尝试awk或实际上gawk;

fread("gawk '$2==425 {print $1}' test.dat", header = FALSE)
#       V1
# 1: 3.463

用于匹配第二列,因此我扩展到匹配第2列和第3列;

fread("gawk '$2==425||$3==425 {print $1}' test.dat", header = FALSE)
# Error in fread("gawk '$2==425||$3==425 {print $1}' test.dat"  : 
#   File is empty: ...

其他尝试;

fread("gawk '$2==\"425\"||$3==\"425\" {print $1}' test.dat", header = FALSE)
# Error in fread("gawk '$2==\"425\"||$3==\"425\" {print $1}' test.dat",  : 
#    File is empty: ...

fread("gawk '{ if ($2==425 || $3==425) print $1; }' test.dat")
# print was unexpected at this time.
# Error in fread("gawk '{ if ($2==425 || $3==425) print $1; }' test.dat",  : 
#    File not found: ...
# In addition: Warning messages:
# 1: running command ... had status 1 
# 2: In shell(paste("(", input, ") > ", tt, sep = "")) :
#   '(gawk '{ if ($2==425 || $3==425) print $1; }' test.dat) > ..' execution failed with error code 1

我测试了linux机器上的尝试,它确实给了我想要的结果。我一直在寻找和尝试不同的解决方案,但无济于事。有人有建议吗?

如果需要,这是我的sessionInfo();

R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.10.4    RevoUtilsMath_10.0.0

loaded via a namespace (and not attached):
[1] compiler_3.4.0   RevoUtils_10.0.4 tools_3.4.0 

1 个答案:

答案 0 :(得分:1)

我不确定它是否在Windows上受支持,但这里有一个解决方案,可以在linux上使用grep:

fread("grep ' 425 \\| 425$' test.dat", header = F)

以下是它的工作原理:

  1. 第一个模式与' 425 '匹配,4.425检查空格所包含的兴趣数量(因此,它不匹配14251' 425[end of line]'

  2. 第二种模式与|匹配,因为第一种模式无法捕获

  3. 使用\运算符连接两个模式,该运算符是双重转义\(需要自行转义的fread("grep ',425,\\|,425$' test.dat", header = F) 字符)

  4. 如果csv文件以逗号分隔,则应该起作用:

    azuka$ : xhost +
    azuka$ : sudo su
    root$ : sh netbeans-8.2-php-linux.sh