如何使用Unix从文件中的每一行获取特定字符串的搜索计数?

如何使用Unix从文件中的每一行获取特定字符串的搜索计数?,unix,awk,grep,Unix,Awk,Grep,我试图从每一行中搜索Unix文件中的特定字符串,并将这些记录出错。有人能告诉我如何改进我的代码,如下所示。如果你有更好的解决方案,也请分享你的想法 v_filename=$1; v_new_file="new_file"; v_error_file="error_file"; echo "The input file name is $var1" while read line do echo "Testing $line" v_cnt_check=`grep

我试图从每一行中搜索Unix文件中的特定字符串,并将这些记录出错。有人能告诉我如何改进我的代码,如下所示。如果你有更好的解决方案,也请分享你的想法

v_filename=$1;
v_new_file="new_file";
v_error_file="error_file";
echo "The input file name is $var1"

while read line
do
        echo "Testing $line"
        v_cnt_check=`grep ',' $line | wc -l`
        echo "Testing $v_cnt_check"
#       if [  $v_cnt_check > 2 ]; then
#       echo $line >> $v_error_file
#       else
#       echo $line >> $v_new_file
#       fi
done < $v_filename
输出:

(New file)
1,2,3
1,2,3 

(Error file)
1,2,3,4 
从grep手册页:

   General Output Control
   -c, --count
          Suppress normal output; instead print a count of matching lines for each input file.  With the -v, --invert-match  option  (see  below),  count  non-
          matching lines.  (-c is specified by POSIX.)
你可以这样做:

grep --count "your pattern" v_filename
以获取出现的次数。如果您只需要模式的行数,请将上面显示的grep替换为:

grep "your pattern" v_filename | wc -l
第一行设置文件名变量,并将字段分隔符设置为逗号。第二行也将输出字段分隔符设置为逗号。第三行将包含3个字段的行打印到新文件中;第四行将包含3个字段以外的行打印到错误文件中


请注意,您的代码在大文件上的速度会非常慢,因为它每行执行两个进程。此代码只有一个进程在整个文件上运行-如果输入增加到数千行或数百万行或更多行,这将非常重要。

发布一些示例输入和预期输出,因为不清楚您要做什么。因此,从输入和输出判断,你想消除每一行上没有三个逗号分隔的字段,对吗?你真是太棒了。我们不能使用grep命令在一行内搜索字符串,也可以借助while循环进行搜索吗?如果愿意,可以使用
grep
。这不是最好的方法,但如果你愿意,你可以。请注意,
grep-c
统计模式匹配的行数,而不是单个行上的匹配数。因此,您必须做一些花哨的诡计来获得输入行中字段数的计数。谢谢Jonathan。。在使用grep搜索特定行中的角色时,我仍然没有那个技巧。看来单靠grep是不行的我同意单靠grep是不够的。
grep "your pattern" v_filename | wc -l
awk -F ',' -v new_file="$v_new_file" -v err_file="$v_error_file" \
    'BEGIN { OFS="," }
     NF == 3 { print >new_file }
     NF != 3 { print >err_file }' $v_filename