UNIX shell脚本:按条目拆分文本文件

时间:2011-03-02 12:20:37

标签: shell unix

我正在尝试分析一个巨大的文本文件(1.6GB),其数据行如下所示:

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,但确实有办法一次完成所有日期,对吗?

提前致谢, 亚历

3 个答案:

答案 0 :(得分:5)

使用awk:

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

答案 1 :(得分: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

答案 2 :(得分:0)

随着每天需要超过1条记录的警告, 并且输出文件将有空行:

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

我们真的应该选择uniq输出甚至uniq记录。 此外,csplit应该有一个选项来抑制匹配的行。