如何快速分开文件内容
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
如何快速分开文件内容
我有一个文件
1.2
3.4
8.3
5.9
3.1
10.0
我想把小于5的分在1文件,大于5的分在2文件。我用if判断每行分,对于几千行的文件太慢。有没有什么快速的方法分开,我想过用sort ,但是不知到怎么写??
1.2
3.4
8.3
5.9
3.1
10.0
我想把小于5的分在1文件,大于5的分在2文件。我用if判断每行分,对于几千行的文件太慢。有没有什么快速的方法分开,我想过用sort ,但是不知到怎么写??
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: 如何快速分开文件内容
如果只是这个要求的话,直接用excel就可以啊,复制数据进去,然后排序,再把它一分为二就好,如果是为了学习脚本,那么…………我还真不太会,等 

-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
我听说过二元查找,不知谁会?
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
NR=`cat $region/temp.dat | wc -l`
i=1
j=$NR
until [ `echo " $(($j-$i))=1 "|bc` -eq 1 ]
do
k=`" ($i+$j)/2 | bc "`
x=`sed -n ${k}p $region/temp.dat | awk '{print $6}'`
if [ `echo "scale=2;$x < 2048 " | bc ` - eq 1 ] ;then
$i=$k
else
$j=$k
fi
done
不知道哪儿出问题了??(我是以2048为分界的,$region/temp.dat已经排序了)
i=1
j=$NR
until [ `echo " $(($j-$i))=1 "|bc` -eq 1 ]
do
k=`" ($i+$j)/2 | bc "`
x=`sed -n ${k}p $region/temp.dat | awk '{print $6}'`
if [ `echo "scale=2;$x < 2048 " | bc ` - eq 1 ] ;then
$i=$k
else
$j=$k
fi
done
不知道哪儿出问题了??(我是以2048为分界的,$region/temp.dat已经排序了)
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 如何快速分开文件内容
你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序
下面这段不用排序
代码: 全选
rm file1 file2
awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 如何快速分开文件内容
awk里,一般情况> 就可以了, 只有文件多需要append/close的时候,需要>>astolia 写了:你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序代码: 全选
rm file1 file2 awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
I would do:
代码: 全选
awk '{print $0 > ($0>5?"file1":"file2")}' file
---
regards,
Kent
regards,
Kent
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
一个文件:astolia 写了:你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序代码: 全选
rm file1 file2 awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
3
7
10
5
-100
100
我想写一个程序,把那些大于小于3sigma范围的行删去,即(平均值+-3*标准差)之外,很明显-100,100该去掉。如何写运行快??
如果用if是不是太慢。
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
一个文件:
3
7
10
5
-100
100
我想写一个程序,把那些大于小于3sigma范围的行删去,即(平均值+-3*标准差)之外,很明显-100,100该去掉。如何写运行快??
如果用if是不是太慢。
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
mean=`cat ${region}_SIMLC/$i | awk '{a+=$2}END{print a/"'"$NR"'"}' `
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [`echo "scale=3;$mag > $up " |bc` == 1 || `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
不知道哪里出问题了?
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [`echo "scale=3;$mag > $up " |bc` == 1 || `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
不知道哪里出问题了?
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 如何快速分开文件内容
[quote="悬崖勒马2011"]mean=`cat ${region}_SIMLC/$i | awk '{a+=$2}END{print a/"'"$NR"'"}' `
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [ `echo "scale=3;$mag > $up " |bc` == 1 -o `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
这样运行太慢?有没有类似awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file 的命令?
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [ `echo "scale=3;$mag > $up " |bc` == 1 -o `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
这样运行太慢?有没有类似awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file 的命令?