为避免将大型数据集(> 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
答案 0 :(得分:1)
我不确定它是否在Windows上受支持,但这里有一个解决方案,可以在linux上使用grep:
fread("grep ' 425 \\| 425$' test.dat", header = F)
以下是它的工作原理:
第一个模式与' 425 '
匹配,4.425
检查空格所包含的兴趣数量(因此,它不匹配14251
或' 425[end of line]'
)
第二种模式与|
匹配,因为第一种模式无法捕获
使用\
运算符连接两个模式,该运算符是双重转义\
(需要自行转义的fread("grep ',425,\\|,425$' test.dat", header = F)
字符)
如果csv文件以逗号分隔,则应该起作用:
azuka$ : xhost +
azuka$ : sudo su
root$ : sh netbeans-8.2-php-linux.sh