簡體   English   中英

根據bash中的第一列將一個較大的CSV文件分離為較小的文件

[英]Separate one large CSV file in smaller files based on the first column in bash

我有幾個包含以下信息的大型CSV文件(每個〜20 MiB)。 我想找到一種方法,可以根據第一列中的日期將此文件分成較小的文件。 例如:以下段將分為2個文件,即20130719.csv20130720.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

這是簡化的外殼版本

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可能是更好的選擇,具體取決於行的排序方式

'csplit'幾乎可以滿足您的需要,但是您需要知道編寫正則表達式的日期范圍(如果沿這條路線走,您可以輕松地用'head'和'tail'來獲取它們。)知道他們還有awk一線:

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

這會將整行$ 0放入名為$ 1.csv的文件中。 如果以有趣的方式用特殊字符指定了您的日期,則可能需要對日期進行修飾,以使其適合您的操作系統。 “ gensub”用點代替正斜杠。

關於對顏色標簽的排序:您具有shell實用程序'sort -k4,4'來指定只希望對第四個字段進行排序,但是獲得的字母順序可能並不是您想要的。 然后再次出現“ awk”,盡管我發現使用awk的動態數組排序(將所有行轉儲到數組中,然后在END規則中對其調用“ asort”)並不是很快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM