如何使用Unix从文件中的每一行获取特定字符串的搜索计数?
我试图从每一行中搜索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
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