Сбрасывание обратной косой черты с помощью awk в OSX

Я пытаюсь сопоставить \ N в поле файла csv.

я пробовал

awk -F "|" '($12=="\N") {print}' ./filename.csv awk -F "|" '($12==\N) {print}' ./filename.csv awk -F "|" '($12==\\N) {print}' ./filename.csv awk -F "|" '($12==\\\\N) {print}' ./filename.csv 

пока ничего не работает

One Solution collect form web for “Сбрасывание обратной косой черты с помощью awk в OSX”

В Bourne-like (например, bash ), Csh-подобных или rc-подобных оболочках, используйте:

 awk -F'|' '$12 == "\\N"' 

В awk-строках обратная косая черта используется для представления C-подобных escape-последовательностей, таких как \b для backspace, \n для новой строки, \123 для восьмеричных последовательностей … Вам нужно \\ для обратной косой черты. \N сама по себе не является известной escape-последовательностью в любой реализации awk которую я знаю.

Некоторые реализации awk будут обрабатывать "\N" как \ и N , некоторые как N , некоторые (gawk), такие как N с предупреждающим сообщением. POSIX оставляет поведение неуказанным.

Обратите внимание, что это также относится к строкам, переданным как:

 awk -F'|' -v value='\\N' '$12 == value' 

Или:

 awk -F'|' '$12 == value' value='\\N' 

Вы можете использовать среду для передачи значения как есть, не беспокоясь о том, чтобы избежать специальных символов для awk :

 VALUE='\N' awk -F'|' '$12 == ENVIRON["VALUE"]' 

Это также относится к литералам регулярного выражения, выражаемым как /.../ например, в:

 awk -F'|' '$12 ~ /\\N/' 

Тем не менее, это еще более осложняется тем фактом, что обратная косая черта перегружена как инкрементатор escape-последовательности (для \n , \b …) и как оператор цитирования для регулярных выражений ( \. Или \$ … для удаления их особый смысл оператора регулярного выражения). POSIX в настоящее время неясен (и даже не соответствует действительности в некоторых случаях) по этому /\\./ в нескольких угловых случаях (например, на /\56/ /\\./ или /\56/ или /[\135]/ ). Снова использование ENVIRON может помочь, хотя и не всегда. Например:

 R='[\]' awk '$0 ~ ENVIRON["R"]' 

должен совпадать с обратным слэшем в POSIX, но возвращает ошибку во всех реализациях awk которые я знаю. Лучше всегда избегать \ даже внутри [...] если это нужно воспринимать буквально, чтобы быть в безопасности.

Обратите внимание, что для оболочки fish вам нужен еще один слой экранирования, как для fish (в отличие от большинства других оболочек), \ является специальным в одинарных кавычках. Поэтому вам нужно:

 awk -F'|' '$12 == "\\\\N"' 

там. Хоть

 awk -F'|' '$12 == "\\\N"' 

также будет работать.

 env 'V=\N' awk -F'|' '$12 == ENVIRON["V"}' 

также должны работать (в fish и других семействах оболочек).

  • awk для извлечения аргумента опции
  • Как проверить, существует ли файл в awk?
  • Разберите несколько тысяч строк txt в строки и столбцы
  • Учебный материал Sed and Awk
  • Заменить текст между скобками
  • Как передать переменную оболочки в шаблон поиска awk?
  • Измените текст в теге, но только тег содержится в определенном блоке XML
  • Когда интерпретировать awk как команду или язык программирования?
  • Как добавить новый символ после каждой строки?
  • Сделать awk использовать bash с помощью команды system ()
  • Используя awk для изменения целого столбца как положительных, так и отрицательных значений, просто отрицательный?
  • Linux и Unix - лучшая ОС в мире.