Я использую Ubuntu Linux с оболочкой удара. Как я выхожу из апострофов в awk операторе? Я хочу произвести некоторый SQL после извлечения данных из файла с помощью awk, таким образом, я имею:
awk -F',' '{print "SELECT * from user where id = '"$2"';"}' myfile.csv
Но это распечатывает только:
SELECT * from user where id = ;
Если я изменяю вышеупомянутое к
awk -F',' '{print "SELECT * from user where id = "$2";"}' myfile.csv
затем я получаю оператор как
SELECT * from user where id = cf915247dfcf47b6814b5350e5cbdfd8;
но нет никаких одинарных кавычек вокруг идентификатора, в котором я нуждаюсь.
Вы могли бы хотеть приблизиться к этому двумя способами:
одинарная кавычка Передачи через переменную:
awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
Используют шестнадцатеричное значение одинарной кавычки в printf операторе:
awk -F',' '{printf "SELECT * from user where id = %c%s%c;\n",0x27,$2,0x27}' myfile.csv
Это собирается выглядеть сумасшедшим, но здесь Вы идете:
awk -F',' '{print "SELECT * from user where id = '"'"'" $2 "'"'"'" ";"}' myfile.csv
SELECT * from user where id = 'cf915247dfcf47b6814b5350e5cbdfd8';
Hope это помогает!
\47
(или \047
) в Вашей строке, который awk
берет для значения '
.awk -F, '{print "SELECT * from user where id = \47" $2 "\47;"}' myfile.csv
Это - вид неэлегантных ("Каково повторное волшебное значение '47' выполнение?!"), но синтаксис является чистым, и эта техника для того, чтобы сделать одинарную кавычку является симпатичный хорошо известный.
awk
что обработки \47
особенно, не Ваша оболочка. В '
'
- заключенные в кавычки строки, оболочки стиля Границы как Bash не выполняют расширений. Оболочки C как tcsh
сделайте, но они не расширяются \47
и это все еще работает.
Можно предпочесть использовать \047
вместо \47
. Они оба работа, если \47
сразу сопровождается восьмеричной цифрой (0-7), в этом случае необходимо использовать \047
постараться не указывать на неправильный символ. Обратите внимание что, в отличие от этого, на некоторых языках, 47
в \47
является восьмеричным даже без продвижения 0
; посмотрите ниже.
\47
средний? Почему это использует \47
когда тот путь использует 0x27
?Это вызвано тем, что два sixteens делают четыре восьмерок.
\47
восьмеричная последовательность символов, таким образом, это 4×8 + 7×1 = 39.0x27
шестнадцатеричный числовой литерал, таким образом, это 2×16 + 7×1 = 39.printf
%c
спецификатор форматирует его как символ.Сверение python -c 'print int("47", 8), int("27", 16)'
дает 39 39
, как ожидалось.