Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX shell脚本:按文本文件的条目拆分文本文件_Shell_Unix - Fatal编程技术网

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

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年

我试图分析一个巨大的文本文件(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文件“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,只需检查当前行中的日期是否等于上次保存的日期。更改时,请更改保存的值。