Вызов comm из system() в R с подстановкой процесса
Из соображений эффективности я бы хотел вызвать comm в R через system(). Я привык использовать такой синтаксис, как:
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 `('
Я предполагаю, что это как-то связано с экранированием одинарных кавычек в bash -c внутри строки в двойных кавычках в system(). Я немного озадачен тем, как управлять одинарными кавычками в bash -c внутри строки в двойных кавычках в system(). Как мне сориентироваться во всех этих побегах?
1 ответ
Чтобы решить эту проблему, мне просто нужно было избежать всего, что находится внутри:
bash -c "[within]"
Использование правил побега bash ( https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html) и всего, что находится внутри:
system("[within2]")
Использование правил побега Р.
Конечный результат - двойные экранирующие косые черты и кавычки (bash и R) и одиночные экранирующие $ (bash).