问题描述
当这个单词也以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”?
解决方法
您可以使用诸如(^|[^?])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