当前位置: 技术问答>linux和unix
请高手来帮我看一下这个shell脚本
来源: 互联网 发布时间:2016-08-05
本文导语: #!/bin/sh billpath=/home/infox/test temppath=/home/infox touch $temppath/tempresult.txt cd $billpath for ifile in * do count=0 awk -F, '{if ($2 ~/60/) {count='expr $count+1'}}' printf $count,",",$FILENAME,"n" >> $temppath/tempresult.txt done ...
#!/bin/sh
billpath=/home/infox/test
temppath=/home/infox
touch $temppath/tempresult.txt
cd $billpath
for ifile in *
do
count=0
awk -F, '{if ($2 ~/60/) {count='expr $count+1'}}'
printf $count,",",$FILENAME,"n" >> $temppath/tempresult.txt
done
sort -t: +1 $temppath/tempresult.txt > $temppath/temp.txt
flag=0
awk -F, '{if ($flag -eq 1) {exit 0} flag='expr $flag+1';rm $temppath/tempresult.txt;rm $temppath/temp.txt}'
把每个文件里面第二个字段是60 的记录统计下来,然后把该文件名和记录条数放到临时文件里面。我把这个临时文件排序,然后读出临时文件里面的第一条记录。。。为什么不行呢……
拜托各位大虾!!!!
billpath=/home/infox/test
temppath=/home/infox
touch $temppath/tempresult.txt
cd $billpath
for ifile in *
do
count=0
awk -F, '{if ($2 ~/60/) {count='expr $count+1'}}'
printf $count,",",$FILENAME,"n" >> $temppath/tempresult.txt
done
sort -t: +1 $temppath/tempresult.txt > $temppath/temp.txt
flag=0
awk -F, '{if ($flag -eq 1) {exit 0} flag='expr $flag+1';rm $temppath/tempresult.txt;rm $temppath/temp.txt}'
把每个文件里面第二个字段是60 的记录统计下来,然后把该文件名和记录条数放到临时文件里面。我把这个临时文件排序,然后读出临时文件里面的第一条记录。。。为什么不行呢……
拜托各位大虾!!!!
|
总结一下你的帖子以及QQ上的留言,我猜测你的需求是这样的:
1. /home/infox/test目录下有多个文件,每个文件有多行记录,每个记录有多个字段,字段直接用','分隔(根据awk -F,);
2. 统计所有文件第二个字段为60或62的行数,并以"行数,文件名"的格式输出到临时文件中(根据printf $count,",",$FILENAME,"n" >> $temppath/tempresult.txt);
3. 根据行数对临时文件进行从小到大排序,因为在(2)中输出的临时文件用逗号(,)做分隔符,而你在sort命令中(sort -t: +1 $temppath/tempresult.txt)用冒号(:)做间隔符,不晓得是你笔误还是什么。
4. 仅输出第一行
简言之就是“输出第二个字段为60或62行数最小行数以及文件名”
这不需要脚本,直接在shell中执行:
egrep -c '^[^,]*,6[02](,.*)?$' * | sort | awk -F: 'NR==1{print $2","$1}'
其中 egrep -c 'pattern' * 的作用就是输出每个文件的中匹配正则表达式pattern的行数,格式是“文件:行数”;
正则表达式 ^[^,]*,6[02](,.*)?$ 的意思是匹配第一个和第二个逗号(,)之间是60或62,即以逗号为分隔符第二个字段是60或62;
然后把结果给sort排序,最后给awk,这里需要调整格式,egrep输出的格式是“文件:行数”,你的格式是“行数,文件”,所以,awk的作用是调整格式,以及仅仅输出第一行(NR==1)
1. /home/infox/test目录下有多个文件,每个文件有多行记录,每个记录有多个字段,字段直接用','分隔(根据awk -F,);
2. 统计所有文件第二个字段为60或62的行数,并以"行数,文件名"的格式输出到临时文件中(根据printf $count,",",$FILENAME,"n" >> $temppath/tempresult.txt);
3. 根据行数对临时文件进行从小到大排序,因为在(2)中输出的临时文件用逗号(,)做分隔符,而你在sort命令中(sort -t: +1 $temppath/tempresult.txt)用冒号(:)做间隔符,不晓得是你笔误还是什么。
4. 仅输出第一行
简言之就是“输出第二个字段为60或62行数最小行数以及文件名”
这不需要脚本,直接在shell中执行:
egrep -c '^[^,]*,6[02](,.*)?$' * | sort | awk -F: 'NR==1{print $2","$1}'
其中 egrep -c 'pattern' * 的作用就是输出每个文件的中匹配正则表达式pattern的行数,格式是“文件:行数”;
正则表达式 ^[^,]*,6[02](,.*)?$ 的意思是匹配第一个和第二个逗号(,)之间是60或62,即以逗号为分隔符第二个字段是60或62;
然后把结果给sort排序,最后给awk,这里需要调整格式,egrep输出的格式是“文件:行数”,你的格式是“行数,文件”,所以,awk的作用是调整格式,以及仅仅输出第一行(NR==1)