2013-10-01 2 views
0

У меня есть несколько больших файлов CSV (~ 20 MiB каждый), содержащих информацию как следующую. Я хотел бы найти способ разделить этот файл на более мелкие файлы на основе даты в первом столбце. Например: следующий сегмент будет разделен на 2 файла, а именно 20130719.csv и 20130720.csv.Отделите один большой файл CSV в меньших файлах на основе первого столбца в bash

Я также хотел бы отсортировать (в пределах каждого меньшего размера) в соответствии с 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 x бесплатное дисковое пространство? ;-) Удачи. – 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 Если дата указана в смешном способе с особенным персонажи, которые вам могут понадобиться для массажа, чтобы быть приемлемыми для вашей ОС. «Генсуб» заменяет косую черту точками.

Что касается сортировки по цветовому тегу: у вас есть утилита shell «sort -k4,4», чтобы указать, что вы хотите сортировать только четвертое поле, но алфавитный порядок, который вы получаете, может быть не таким, каким вы хотите. Затем снова появляется «awk», хотя я нахожу, что сортировка с динамическими массивами awk (вы выгружаете все свои строки в массив, а затем вызываете «asort» на нем в правиле END) не очень быстро молниеносно.

+0

Обратите внимание, что значение '$ 1' содержит косые черты, поэтому вам действительно нужно обработать значение в $ 1, чтобы создать правильное имя файла. –

Смежные вопросы