![根据文本文件的条目拆分文本文件](https://linux22.com/image/1104133/%E6%A0%B9%E6%8D%AE%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%A1%E7%9B%AE%E6%8B%86%E5%88%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6.png)
我正在尝试分析一个巨大的文本文件(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