出于效率原因,我想通过system()调用R中的comm。我已经习惯于使用如下语法:
comm -13 <(hadoop fs -cat /path/to/file | gunzip | awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '{if($7 ~ /^".*"$/ && $9 ~ /^".*"$/) {print toupper($7),toupper($9)} else if($7 ~ /^[^"]/ && $9 ~ /^["]/) {print "\""toupper($7)"\"",toupper($9)} else if($7 ~ /^[^"]/ && $9 ~ /^[^"]/) {print "\""toupper($7)"\"","\""toupper($9)"\""}}' | sort) <(awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '{if($1 ~ /^".*"$/ && $2 ~ /^".*"$/) {print toupper($1),toupper($2)} else if($1 ~ /^[^"]/ && $2 ~ /^["]/) {print "\""toupper($1)"\"",toupper($2)} else if($1 ~ /^[^"]/ && $2 ~ /^[^"]/) {print "\""toupper($1)"\"","\""toupper($2)"\""}}' /path/to/file | sort)
但是在系统中使用此语法时,如
system("comm -13 <(filea) <fileb)")
我得到了熟悉的错误:
sh: -c: line 0: syntax error near unexpected token `('
从上面可以清楚地看出,system()正在使用sh而不是bash,并且不支持该进程替换。在阅读其他文章后,我尝试使用
system("bash -c 'comm -13 <(hadoop fs -cat /path/to/file | gunzip | awk -vFPAT='([^,]*)|(\"[^\"]+\")' -vOFS=, '{if($7 ~ /^\".*\"$/ && $9 ~ /^\".*\"$/) {print toupper($7),toupper($9)} else if($7 ~ /^[^\"]/ && $9 ~ /^[\"]/) {print \"\\\"\"toupper($7)\"\\\"\",toupper($9)} else if($7 ~ /^[^\"]/ && $9 ~ /^[^\"]/) {print \"\\\"\"toupper($7)\"\\\"\",\"\\\"\"toupper($9)\"\\\"\"}}' | sort) <(awk -vFPAT='([^,]*)|(\"[^\"]+\")' -vOFS=, '{if($1 ~ /^\".*\"$/ && $2 ~ /^\".*\"$/) {print toupper($1),toupper($2)} else if($1 ~ /^[^\"]/ && $2 ~ /^[\"]/) {print \"\\\"\"toupper($1)\"\\\"\",toupper($2)} else if($1 ~ /^[^\"]/ && $2 ~ /^[^\"]/) {print \"\\\"\"toupper($1)\"\\\"\",\"\\\"\"toupper($2)\"\\\"\"}}' /path/to/file | sort)")
也就是说,根据需要转义双引号和反斜杠。但是,这会返回相同的错误:
sh: -c: line 0: syntax error near unexpected token `('
我猜这与在system()中双引号字符串中的bash -c中单引号的转义有关。我对如何在system()中的双引号字符串中的bash -c 中管理单引号感到困惑。我应该如何浏览所有这些逃逸?
答案 0 :(得分:0)
要解决这个问题,我只需要逃避内部的一切:
value
使用bash的转义规则(https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html),以及in2中的所有内容:
value
使用R的转义规则。
最终结果是双重转义反斜杠和引号(bash和R),以及单个转义$(bash)。