我正在验证管道分隔文件中的几列。我的第二栏默认为'*'。
E.g。要验证的文件数据:
abc|* |123
def|** |456
ghi|* |789
由于数据错误,第二条记录有2颗星。
我把它当成了:
Value_to_match="*"
unmatch_count=cat <filename>| cut -d'|' -f2 | awk '{$1=$1};1' | grep -vw "$Value_to_match" | sort -n | uniq | wc -l
echo "unmatch_count"
这让我算作0,而我期望1(对于**
),因为我使用-w
与grep完全匹配,-v是反向匹配。
我怎样才能**
?
答案 0 :(得分:1)
这里的问题是grep
考虑**
正则表达式。为防止这种情况,请使用-F
来使用固定字符串:
grep -F '**' file
但是,你有一套不必要的大型管道操作,而awk
只能处理它。
如果要在第二列中检查包含**
的行,请说:
$ awk -F"|" '$2 ~ /\*\*/' file
def|** |456
如果你想计算你有多少这样的行,请说:
$ awk -F"|" '$2 ~ /\*\*/ {sum++} END {print sum}' file
1
请注意awk
的使用情况:
-F"|"
将字段分隔符设置为|
。$2 ~ /\*\*/
说:嘿,在每一行检查第二个字段是否包含两个星号(记住我们用|
切片行)。我们正在逃避*
,因为它具有作为正则表达式的特殊含义。如果要输出那些只有一个星号作为第二个字段的行,请说:
$ awk -F"|" '$2 ~ /^*\s*$/' file
abc|* |123
ghi|* |789
或者检查那些与此正则表达式不匹配的!~
:
$ awk -F"|" '$2 !~ /^*\s*$/' a
def|** |456