如何快速分开文件内容

sh/bash/dash/ksh/zsh等Shell脚本
回复
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

如何快速分开文件内容

#1

帖子 悬崖勒马2011 » 2014-05-26 9:50

我有一个文件
1.2
3.4
8.3
5.9
3.1
10.0
我想把小于5的分在1文件,大于5的分在2文件。我用if判断每行分,对于几千行的文件太慢。有没有什么快速的方法分开,我想过用sort ,但是不知到怎么写??
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 如何快速分开文件内容

#2

帖子 jinjiachen » 2014-05-26 9:53

如果只是这个要求的话,直接用excel就可以啊,复制数据进去,然后排序,再把它一分为二就好,如果是为了学习脚本,那么…………我还真不太会,等 :em06
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#3

帖子 悬崖勒马2011 » 2014-05-26 9:59

我听说过二元查找,不知谁会?
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#4

帖子 悬崖勒马2011 » 2014-05-26 10:28

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已经排序了)
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 如何快速分开文件内容

#5

帖子 astolia » 2014-05-26 11:07

你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序

代码: 全选

rm file1 file2
awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 如何快速分开文件内容

#6

帖子 sk1418 » 2014-05-28 16:40

astolia 写了:你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序

代码: 全选

rm file1 file2
awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
awk里,一般情况> 就可以了, 只有文件多需要append/close的时候,需要>>

I would do:

代码: 全选

awk '{print $0 > ($0>5?"file1":"file2")}' file
---
regards,

Kent
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何快速分开文件内容

#7

帖子 eexpress » 2014-05-28 20:44

你又不是次序的增减,二元查找蚊子。
● 鸣学
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#8

帖子 悬崖勒马2011 » 2014-06-03 14:17

sk1418 写了:
astolia 写了:你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序

代码: 全选

rm file1 file2
awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
awk里,一般情况> 就可以了, 只有文件多需要append/close的时候,需要>>

I would do:

代码: 全选

awk '{print $0 > ($0>5?"file1":"file2")}' file
假如我想作3-sigma截断,即大于小于(平均值+3*标准差)范围的都去掉,类似的该怎么写?
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#9

帖子 悬崖勒马2011 » 2014-06-03 18:09

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是不是太慢。
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#10

帖子 悬崖勒马2011 » 2014-06-03 18:09

sk1418 写了:
astolia 写了:你一段脚本里创建了那么多子进程,不慢才怪
下面这段不用排序

代码: 全选

rm file1 file2
awk '{ if($0 > 5){print $0 >>file1}else{print $0>>file2} }' file
awk里,一般情况> 就可以了, 只有文件多需要append/close的时候,需要>>

I would do:

代码: 全选

awk '{print $0 > ($0>5?"file1":"file2")}' file
一个文件:
3
7
10
5
-100
100
我想写一个程序,把那些大于小于3sigma范围的行删去,即(平均值+-3*标准差)之外,很明显-100,100该去掉。如何写运行快??
如果用if是不是太慢。
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#11

帖子 悬崖勒马2011 » 2014-06-04 9:42

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
不知道哪里出问题了?
悬崖勒马2011
帖子: 91
注册时间: 2013-01-23 14:27
系统: ubuntu 12.04

Re: 如何快速分开文件内容

#12

帖子 悬崖勒马2011 » 2014-06-04 10:01

[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 的命令?
回复