2017-01-25 12 views
1

По соображениям эффективности, я хотел бы называть comm в R через system(). Я привык к использованию синтаксиса как:Вызов comm из системы() в R с заменой процесса

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 `(' 

Я предполагаю, что это что-то делать с отводящей одинарные кавычки в Баш -c в двойных кавычках в системе(). Я немного смущен относительно того, как управлять одиночным цитированием в bash -c в пределах двойной кавычки в системе(). Как мне перемещаться по всему экрану?

ответ

0

Чтобы решить эту проблему, я просто необходимо, чтобы избежать все в пределах:

bash -c "[within]" 

Использование правил BASh Побег (https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html), и все, что в within2:

system("[within2]") 

Использование правил эвакуации АиР.

Конечным результатом является двойное экранирование обратных косых черт и кавычек (bash и R) и однократное ускорение $ (bash).