shell 分割文件

帮同事写的小程序

140822,1406181801491716879,221.203.75.168,20140822000014
140823,1408051715321587060,101.28.174.242,20140822000127
140823,1408051715321587060,101.28.174.242,20140822000129
140824,1408051715321587060,101.28.174.242,20140822000139
140824,1406031640261808247,110.254.245.82,20140822000205
140825,1305230023521467300,210.73.6.180,20140822000216
140825,1408181402431171048,110.243.255.56,20140822000216
140825,1408131900341325654,110.248.233.239,20140822000216
140825,1407071756131811923,27.213.51.178,20140822000228
140826,1408171201311863011,124.67.26.134,20140822000238

某个数据文件的内容如上,每行的第一部分是时间140822   2014年8月22日

要按不同的日期分割文件, shell脚本如下:

cat data.txt | while read line
do
if [ -n "$line" ]
then
echo $line
echo ${line%%,*}
echo $line >> "${line%%,*}.txt"
echo "${line##*,}"
fi
done

实际运行中,速度非常差,无法容忍,由于时间的起止是从140822 至  140826

所以程序改为

date
for((i=140818;i<=140826;i++));do
    echo $i;
    awk '{if(/^'$i'/)print $0;}' data.txt >$i.data.csv
done;
date

这样速度有了明显的提升,推断速度提升的原因是减少了IO操作次数,子进程创建和销毁的次数也减少了

尝试使用grep替代awk命令发现速度更快

date
for((i=140818;i<=140826;i++));do
    echo $i;
    grep "$i," data.txt > "${i}.txt"
done;
date

使用awk命令耗时为6分钟左右,而使用grep 命令耗时大约为3分多钟

即使是shell命令也是非常有意思的。

时间: 2024-09-30 00:27:22

shell 分割文件的相关文章

shell 判断文件、目录是否存在

shell判断文件是否存在 1. shell判断文件,目录是否存在或者具有权限 2. #!/bin/sh 3. 4. myPath="/var/log/httpd/" 5. myFile="/var /log/httpd/access.log" 6. 7. # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 8. if [ ! -x "$myPath"]; then 9. mkdir "$myPath" 10

shell判断文件是否存在

转自:http://www.cnblogs.com/sunyubo/archive/2011/10/17/2282047.html 1. shell判断文件,目录是否存在或者具有权限 2. #!/bin/sh 3. 4. myPath="/var/log/httpd/" 5. myFile="/var /log/httpd/access.log" 6. 7. # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 8. if [ ! -x "

java分割文件并且合并文件(zip,rar....)

JAVA分割文件,把一个ZIP文件通过指定的大小分割,然后合并起来. 分割 package com.zkq.objectstream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil

shell读取文件的每一行

写法一: ---------------------------------------------------------------------------- #!/bin/bash while read line do echo $line done < filename(待读取的文件) ---------------------------------------------------------------------------- 写法二: --------------------

shell读取文件的每一行内容并输出【转】

写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的文件) | while read line do echo $line done 写法三: for line in `cat file(待读取的文件)` do echo $line done 说明:for逐行读和while逐行读是有区别的,如: $ cat file aaaa bbbb cccc dddd

linux环境: shell初始化文件, for TCSH, CSH

TCSHELL, CSHELL 配置文件 全局配置文件 /etc/csh.cshrc个人配置文件 ~/.cshrc或~/.tcshrc 参考: 1.配置你的csh/tcsh,  https://wiki.freebsdchina.org/howto/c/config_your_csh 2.我的.cshrc常用设置 http://biancheng.dnbcw.info/bsd/260256.html 我使用csh,喜欢在.cshrc 中添加如下的内容:#给ls增加眼色,给目录名后面加上 '/'a

[转] Linux shell判断文件和文件夹是否存在

shell判断文件,目录是否存在或者具有权限 #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPath" fi #这里的-d 参数判断$myPath是否存在 if [ ! -d "$m

shell判断文件类型和权限

shell  判断文件类型. -d 文件 判断该文件是否存在,并且是否为目录(是目录为真) -e文件 判断该文件是否存在(存在为真) -f文件 判断该文件是否存在,并且是否为文件(是普通文件为真) -r 如果有文件存在 ,判断文件是否具有读权限有读权限返回真-w如果有文件存在 ,判断文件是否具有写权限有写权限返回真-x如果有文件存在 ,判断文件是否具有执行权限有执行权限返回真 在shell中的写法一般是 eg:[空格-e 文件路径 空格] [ -e /tmp/index.php ] [ -e /

JAVA之IO技术 分割文件

/* * 讲一个图片文件按照指定的大小切割成多个碎片文件. * 方法: * 循环读取数据到缓冲区,存放到不同的文件中就OK的啦 */ package ioTest.io3; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class SplitFileDemo { public static void main(String[] args) {