根据文本文件的条目拆分文本文件

根据文本文件的条目拆分文本文件


我正在尝试分析一个巨大的文本文件(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 日)。
我怎样才能根据日期将此文件分割成几部分?

我所知道的一切都是grep file '20090118*' > data20090118.dat,但肯定有办法一次性完成所有日期,对吗?

每个日期的条目数不同,因此使用split常数是行不通的。

提前致谢,
亚历克斯

答案1

假设文件已排序并且日期始终存在,则这应该有效:

#!/bin/bash

base_dir='./'    

while read line; do
    date="${line:0:8}"
    echo "$line" >> "$base_dir$date.txt"
done < "$1"

[将其另存为my_splitter,通过运行使其可执行chmod +x my_splitter,然后像这样调用它./my_splitter input_file]

它逐行读取输入文件,提取日期并使用该日期将具有相同日期的行附加到同一个文件。

base_dir是目标目录,文件将采用 格式<date>.txt。注意:现有文件不会被覆盖,由于>>重定向器,将添加新行,因此最好确保目标目录不包含任何 格式的文件<date>.txt

答案2

这可能对你有用:

awk '{d=substr($1, 1, 8); fn = "data" d ".dat"; print $0 >> fn}' hugefile

答案3

我会使用{x..y},也许用于 y、m、d 级联,shema:

for d in {18..19} ; do grep 200901$d datadata; echo; done 
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

20090119025859 -2.400000 78.100000 1023.200000 0.000000
20090119025900 -2.500000 78.100000 1023.200000 0.000000
20090119025901 -2.400000 78.100000 1023.200000 0.000000

相关内容