Shell 匹配特定单词(不包括以“开始”的单词)&引用;
当某个单词在CSV文件中以问号开头时,我很难找到如何匹配该单词的方法。我需要使用tcsh代码 我的意思是,我可以匹配“cat”,但不包括“zcat”,但它包括“?cat”。这是我的密码:Shell 匹配特定单词(不包括以“开始”的单词)&引用;,shell,csv,awk,tcsh,Shell,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.cs
#!/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
所以这里我只想匹配单词“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{(i=1;i@Sylvain_cmz,很好,您已经以代码的形式展示了您的努力,请您在问题中发布更清晰的示例,然后让我们知道。幸运的是,这避免了任何依赖于您使用的shell的代码。我将重复我的建议,尝试从tcsh
过渡,因为它的用户群非常小更长的时间。我的Awk不喜欢“\>”
,但如果它对你有用,那就去吧。我用“([^A-Za-z0-9|]\124;$)”
)替换了它。谢谢“我所需要的一切,我现在可以很好地过滤我的CSV文件了!很高兴我能这么快得到帮助:)我会看看我能做些什么来摆脱tcsh,我一开始就用这个脚本来学习regexp和shell的使用。可以肯定的是,tsch并不是最有效的脚本,我会看看我能改变什么!
;;;;;;;;PRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;
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