#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 не самый эффективный для создания такого сценария, я посмотрю, что я могу изменить!