Как я выхожу из апострофов в awk операторе?

Я использую 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;

но нет никаких одинарных кавычек вокруг идентификатора, в котором я нуждаюсь.

4
задан 26 September 2017 в 11:06

3 ответа

Вы могли бы хотеть приблизиться к этому двумя способами:

  1. одинарная кавычка Передачи через переменную:

    awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
    
  2. Используют шестнадцатеричное значение одинарной кавычки в printf операторе:

    awk -F',' '{printf "SELECT * from user where id = %c%s%c;\n",0x27,$2,0x27}' myfile.csv
    
2
ответ дан 1 December 2019 в 09:45

Это собирается выглядеть сумасшедшим, но здесь Вы идете:

awk -F',' '{print "SELECT * from user where id = '"'"'" $2 "'"'"'" ";"}' myfile.csv

SELECT * from user where id = 'cf915247dfcf47b6814b5350e5cbdfd8';

Hope это помогает!

1
ответ дан 1 December 2019 в 09:45

Можно просто использовать \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, как ожидалось.

1
ответ дан 1 December 2019 в 09:45

Другие вопросы по тегам:

Похожие вопросы: