Сопоставление определенного слова, исключая слова, начинающиеся на «?»

#shell #csv #awk #tcsh

#оболочка #csv #awk #tcsh

Вопрос:

У меня возникают трудности с поиском способа сопоставления определенного слова, когда это слово также начинается с вопросительного знака внутри CSV-файла. Мне нужно использовать код tcsh.

Я имею в виду, что я могу сопоставить «cat», исключая «zcat», но оно включает «?cat». Вот мой код:

 #!/bin/tcsh -f
set viewSet = PRE_IMPL
set nbViewSet=`awk -F ";" '{ for (i=1; i<=NF; i  ) { if ($i == "VIEW SETS") print i } }' csv.csv`
/usr/bin/awk -F ";" -v col="$nbViewSet" '(match($col, '"/<"$viewSet">/"') != 0) {print}' csv2.csv
  

Итак, с этим кодом у меня есть то, что следует в качестве входного файла CSV:

 STANDARD KEYS;COMPATIBLE KEYS;CELL KEY;COND KEY;WORKSPACE PATH;VIEW PATH;CATEGORIES;CONDS SECTION;VIEW SETS;TYPES
;;;;;;;;PRE_IMPL;
;;;;;;;;zPRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;
  

Итак, здесь я хочу сопоставить только слово «PRE_IMPL», а не «zPRE_IMPL» или «?PRE_IMPL». Моему коду удается исключить «zPRE_IMPL», но не «?PRE_IMPL», и мне не удалось это изменить, результат:

 ;;;;;;;;PRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;
  

Как мне изменить свой код, чтобы он соответствовал только «PRE_IMPL»?

Комментарии:

1. @Sylvain_cmz, хорошо, что вы продемонстрировали свои усилия в виде кода, не могли бы вы опубликовать более четкие примеры в своем вопросе и сообщить нам об этом.

Ответ №1:

Вы можете использовать регулярное выражение, например (^|[^?])PRE_IMPL , требовать, чтобы совпадение было либо в начале поля, либо рядом с символом, который не является вопросительным знаком.

Тангенциально, здесь нет необходимости запускать Awk дважды. (Или использовать /usr/bin/awk в одном месте и только awk в другом.)

 awk -F ";" -v viewSet="$viewSet" '
  NR==1{ for (i=1; i<=NF; i  ) if ($i == "VIEW SETS") col=i; next }
  match($col, "(^|[^?])" viewSet ">")' csv2.csv
  

Комментарии:

1. К счастью, это позволяет избежать любого кода, который зависит от того, какую оболочку вы используете. Я повторю свою рекомендацию, чтобы попытаться перейти от tcsh which больше имеет только очень узкую пользовательскую базу.

2. Моему Awk не нравится ">" , но если это работает для вас, сделайте это. Я заставил его работать, аналогичным образом заменив его на "([^A-Za-z0-9_]|$)" .

3. Спасибо, что все, что мне было нужно, теперь я отлично фильтрую свой CSV-файл! Рад, что я смог получить помощь так быстро 🙂 Я посмотрю, что я могу сделать, чтобы уйти от tcsh, я использовал этот скрипт для изучения регулярных выражений и использования оболочки в начале. Уверен, что tsch не самый эффективный для создания такого сценария, я посмотрю, что я могу изменить!