2013-10-01 42 views
0

我有幾個包含如下信息的大型CSV文件(每個大約20MB)。 我想找到一種方法來根據第一列中的日期將此文件分成更小的文件。例如:以下片段將被分成2個文件,即20130719.csv20130720.csv根據bash中的第一列將較小的文件中的一個大型CSV文件分開

我也想根據第4列(顏色標籤)對每個較小的文件進行排序。 有沒有人對我如何做到這一點有任何建議?

在處理這些類型的東西時,我應該瞭解哪些東西?

19/07/2013 19:14:24:523 6.35099E+17 Dr_Blue 10.42496014 27.17010689 0.685520172 
19/07/2013 19:18:5:903 6.35099E+17 Dr_Yellow 11.09363079 28.57788467 2.010284424 
19/07/2013 19:36:33:645 6.35099E+17 Dr_Blue 10.77513885 28.3723774 1.897870064 
19/07/2013 21:29:36:762 6.35099E+17 Dr_Yellow 10.64018059 28.56962967 1.117245913 
19/07/2013 21:29:37:627 6.35099E+17 Dr_Yellow 11.3354435 27.57170868 1.552354813 
20/07/2013 2:34:28:2 6.35099E+17 Dr_Yellow 10.41067123 26.84050369 0.919301987 
20/07/2013 2:34:28:840 6.35099E+17 Dr_Yellow 10.54369164 27.17712402 0.573934555 
20/07/2013 2:34:33:192 6.35099E+17 Dr_Yellow 10.98471832 28.35677719 1.497600555 
20/07/2013 4:20:28:246 6.35099E+17 Dr_Blue 10.92816448 28.55761147 2.187088013 
+0

的東西,你應該學習/檢查是更好的選擇2-3個可用磁盤空間? ;-) 祝你好運。 – shellter

+1

'man awk'和'man sort' –

回答

2

這裏是一個簡化的外殼版本

IFS="$IFS/" 
while read DAY MO YR A B C D E F || [ "$DAY" ]; do 
    echo "$A $B $C $D $E $F" >> "$YR$MO$DAY.ssv" 
done <infile 

for x in *.ssv; do 
    sort -k4 $x |tr " " "," > ${x%.ssv}.csv 
    rm $x 
done 

在飛行排序,AWK可能因線路如何排序

0

「csplit可」做你需要幾乎什麼,但你需要知道的日期範圍,寫正則表達式來拆分上(你可以很容易地與「頭」和「尾」讓他們,如果你走這。路線如果你不知道他們還有awk的一個班輪:

{ print $0 > gensub(/\//, ".", "g", $1) ".csv"; } 

這使整條生產線$ 0改成一個名爲$ 1.csv文件如果有特殊的一種有趣的方式指定你的約會字符,你可能需要按摩它才能被你的操作系統接受。'gensub'用點替換正斜線。

至於顏色標籤的排序:你有shell實用程序'sort -k4,4'來指定你只想在第四個字段排序,但是你得到的字母順序可能不是你想要的。然後再次出現'awk',雖然我發現使用awk的動態數組進行排序(將所有行轉儲到數組中,然後在END規則中調用'asort')不會很快。請確保您有:

+0

請注意'$ 1'值包含斜線,所以您確實需要處理$ 1中的值以創建正確的文件名。 –

相關問題