2011-03-02 75 views
2

我試圖分析一個巨大的文本文件(1.6GB),其數據線是這樣的:UNIX shell腳本:它的條目拆分文本文件

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,但是肯定有辦法一次完成所有的日期,對嗎?

由於提前, 亞歷

回答

5

用awk:

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

所以現在是時候學習awk了..好吧。謝謝,先生:) – 2011-03-02 13:03:52

+0

是的,它像一個魅力。我喜歡Linux。 – 2011-03-02 13:12:20

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 
+1

-1不起作用。應該是'cut -c 1-8'。 – dogbane 2011-03-02 12:45:10

+0

由於等號周圍的空格也不起作用。 'read'的默認分隔符已經是換行符。不要設置最早的日期並遞增1,只需檢查當前行中的日期是否等於先前保存的日期。當它改變時,改變保存的值。 – 2011-03-02 18:17:25

+0

固定代碼 - 謝謝你們 – l0b0 2011-03-03 09:47:24

0

隨着每一天需要的注意事項有超過1條記錄, 並且輸出文件將有空行:

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

我們確實應該有一個uniq來輸出uniq記錄的選項。 也csplit應該有一個選項來壓制匹配的線。