Сбрасывание обратной косой черты с помощью 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: вставить копию столбца в середине CSV
  • Записывает соответствующий шаблон с Awk
  • извлекать поля из «хвоста -f» потока syslog
  • Как усечь только заданную длину столбца?
  • Вывести часть каждой строки в отдельный файл
  • Объедините вывод из df -h / dev / xvda1 в одну строку
  • Печать всех строк файла с несколькими столбцами в сценарии оболочки
  • Как объединить несколько файлов на основе метки времени
  • Используйте sed или awk для замены текста между столбцами
  • рассчитать числа на конец и слить в одну строку
  • Шаблоны и обработка файлов
  • Linux и Unix - лучшая ОС в мире.