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:~$
效果如下:
输入要处理数字的文本路径 :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
#}
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28