UNIX shell脚本:按文本文件的条目拆分文本文件
我试图分析一个巨大的文本文件(1.6GB),其数据行如下所示:UNIX shell脚本:按文本文件的条目拆分文本文件,shell,unix,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年
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文件“20090118*”>data20090118.dat
,但确实有一种方法可以同时完成所有日期,对吗
提前感谢,,
Alex如果项目是按日期顺序排列的,则此选项应有效:
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
date=20090101#更改为最早日期
而IFS=read-rd$'\n'行
做
如果[“$(回显“$行”|切割-d'-f 1 |切割-c 1-8)”-eq$日期]
然后
回显“$line”>>“$date.dat”
其他的
约会++
fi
完成
使用awk:
awk '{print > "data"substr($1,0,8)".dat"}' myfile
需要注意的是,每天需要有超过1条记录, 并且输出文件将有空行:
uniq --all-repeated=separate -w8 file | csplit -s - '/^$/' '{*}'
我们真的应该可以选择uniq来输出uniq记录。
此外,csplit还应具有抑制匹配线的选项。也不起作用,因为等号周围有空格。
read
的默认分隔符已经是换行符。不要设置最早的日期并递增1,只需检查当前行中的日期是否等于上次保存的日期。更改时,请更改保存的值。