+ -
当前位置:首页 → 问答吧 → wget碰到问题,如何解决?

wget碰到问题,如何解决?

时间:2011-03-20

来源:互联网

原意是整合awk与sort,利用awk的高速特性,过程中搜索有名管道使用例子,一天下来几乎搜不到, 所以贴出来,或许对像我一样的初学者有用。
效果如下:

输入要处理数字的文本路径 :s2.t
开始处理 s2.t 文本: 共有 328048 行

是否有无效数字。。。

至少两个数字?。。。

已处理了 100000 行
用时 0 小时 0 分 1 秒
已处理了 200000 行
用时 0 小时 0 分 3 秒
已处理了 300000 行
用时 0 小时 0 分 4 秒

绝对值最大数是: -123456789012345678901234567890.123456789012345678901234567892

kose5@kose5-Aspire-4552:~$

代码:
#!/bin/bash

function f_get_path
{
   vf_file_path=$(echo $vf_file_path|sed -n 's/ *//p')
   if [[ ${vf_file_path:0:1} == "~" ]];then
      vf_file_path="$PWD"${vf_file_path:1}
   fi
}

function f_begin
{
   clear
   echo -n " 输入要处理数字的文本路径 :"
   read vf_file_path
   f_get_path
   if [[ ! -f $vf_file_path ]];then
      echo "     没有此文本!"
      exit 1
   else
      vg_line_count=$(wc -l < $vf_file_path)
      echo -n "    开始处理 $vf_file_path 文本:  "
      echo "    共有 $vg_line_count 行"
      echo
   fi
   echo "    是否有无效数字。。。"
   if (grep -E -n '[^0-9\. -]|\. | \.|- |[0-9][^0-9\. ][0-9]' $vf_file_path);then
      echo
      echo " 有无效数字!"
      echo
      exit 1
   else
      echo "                       无"
   fi
   echo "     至少两个数字?。。。 "
   if (grep -q '.*[0-9] [0-9].*' $vf_file_path);then
      echo "                        是"
   else
      echo " 否!"
      exit 1
   fi
   vg_time1=$(date +%s)
   export env_pts='/dev/'$(ps|sed -n '2p'|cut -d' ' -f3)    #记录pts号码, 并设为环境变量。
   export env_file_fifo="file_fifo$$"     #记录临时fifo文件名,并设为环境变量。
   mkfifo $env_file_fifo     #创建临时fifo文件。
}

function f_show_time
{
   declare -i vl_time
   vl_time=$(($(date +%s) - $vg_time1))
   declare -i vl_hour=$(($vl_time/3600))
   declare -i vl_minute=$(($vl_time%3600/60))
   declare -i vl_second=$((($vl_time%3600)%60))
   echo "                             用时 $vl_hour 小时 $vl_minute 分 $vl_second 秒" > $env_pts
}

function f_get_fifo_order        #父进程接受子进程指令函数。
{
   local vl_order
   while read vl_order < $env_file_fifo;do
      if [[ $vl_order = "show_time" ]];then          #接受显示时间指令。
         f_show_time    #显示时间。
      elif [[ $vl_order = "close_fifo" ]];then    #接受关闭fifo文件指令。
         break   #退出。
      fi
   done
   rm $env_file_fifo   #删除fifo文件。
}

function f_read_lines
{
   f_get_fifo_order &
   vf_max=$(awk '{
      if (NR%100000 == 0)
         { print "  已处理了 " NR " 行"|"cat > $env_pts";    #利用pts号每两万行显示一次,不经过标准输出。
         print "show_time"|"cat > $env_file_fifo"};     #利用fifo文件调用父进程的f_show_time函数。
      split($0,al_numbers," ");
      for (i in al_numbers) print al_numbers[i]|"sort -n"
      }' $vf_file_path|sed -ne '1p' -e '$p')
   echo "close_fifo" > $env_file_fifo    #向父进程传送关闭fifo文件指令。
}

function f_show_mas
{
   local vl_n1=$(echo $vf_max|cut -d' ' -f1)
   local vl_n2=$(echo $vf_max|cut -d' ' -f2)
   local vl_n1b=$(echo $vl_n1|tr -d " -")
   local vl_n2b=$(echo $vl_n2|tr -d " -")
   echo
   if [[ $(echo "$vl_n1b > $vl_n2b"|bc) -eq 1 ]];then
      echo "      绝对值最大数是: $vl_n1"
   elif [[ $(echo "$vl_n1b < $vl_n2b"|bc) -eq 1 ]];then
      echo "      绝对值最大数是: $vl_n2"
   else
      echo "      绝对值最大数是:  $vl_n1    和    $vl_n2"
   fi
   echo
}

#MAIN
#{
   f_begin
   export -f f_show_time
   f_read_lines
   f_show_mas
   exit 0
#}

作者: fnan   发布时间: 2011-03-20

热门下载

更多