2011-03-02 77 views
2

我试图分析一个巨大的文本文件(1.6GB),其数据线是这样的:UNIX shell脚本:它的条目拆分文本文件

20090118025859 -2.400000 78.100000 1023.200000 0.000000 
20090118025900 -2.500000 78.100000 1023.200000 0.000000 
20090118025901 -2.400000 78.100000 1023.200000 0.000000 

我甚至不知道如何有很多线路。但我试图按日期分割文件。左边的数字是一个时间戳(例如这些行是从2009年1月18日)。 如何根据日期将这个文件分割成几部分?

每个日期的条目数不同,因此使用split和常数不起作用。 我知道的一切都是grep file '20090118*' > data20090118.dat,但是肯定有办法一次完成所有的日期,对吗?

由于提前, 亚历

回答

5

用awk:

awk '{print > "data"substr($1,0,8)".dat"}' myfile 
+0

所以现在是时候学习awk了..好吧。谢谢,先生:) – 2011-03-02 13:03:52

+0

是的,它像一个魅力。我喜欢Linux。 – 2011-03-02 13:12:20

1

这应该工作,如果项目在日期顺序:

date=20090101 # Change to the earliest date 
while IFS= read -rd $'\n' line 
do 
    if [ "$(echo "$line" | cut -d ' ' -f 1 | cut -c 1-8)" -eq $date ] 
    then 
     echo "$line" >> "$date.dat" 
    else 
     let date++ 
    fi 
done < log.dat 
+1

-1不起作用。应该是'cut -c 1-8'。 – dogbane 2011-03-02 12:45:10

+0

由于等号周围的空格也不起作用。 'read'的默认分隔符已经是换行符。不要设置最早的日期并递增1,只需检查当前行中的日期是否等于先前保存的日期。当它改变时,改变保存的值。 – 2011-03-02 18:17:25

+0

固定代码 - 谢谢你们 – l0b0 2011-03-03 09:47:24

0

随着每一天需要的注意事项有超过1条记录, 并且输出文件将有空行:

uniq --all-repeated=separate -w8 file | csplit -s - '/^$/' '{*}' 

我们确实应该有一个uniq来输出uniq记录的选项。 也csplit应该有一个选项来压制匹配的线。