2014-11-23 2 views
0

Я довольно новичок в Linux и считаю, что это должна быть довольно простая задача, но я не могу это понять. У меня есть большой файл данных с миллионами строк, и я хочу разбить файл на более мелкие файлы на основе даты. У меня есть столбец времени, который содержит данные YYMMDDHH, и я хочу создать субфайлы на основе DD. Для каждого нового DD я хочу создать новый файл со всеми записями за этот день. Файл является csv и уже отсортирован по времени.Подмножество CSV по уникальным значениям столбца

Из того, что я прочитал, похоже, что я должен использовать cat, awk и, возможно, grep для выполнения того, что я хочу.

Чтобы уточнить, имеется 14 столбцов в строке. Один столбец содержит данные, содержащие YYMMDDHH (т.е. 14071000, 14071000 ... 14071022,14071022 .... 14071100 ... 14071200 ...)

я могу вручную подмножеством с

cat trial | awk 'NR>=1 && NR<=100 {print}' >output.txt 

Это дает мне строки от 1 до 100. Мне было интересно, есть ли команда, которая позволяет мне извлекать из колонки YYMMDDHH, так что все точки данных на 140710 могут быть помещены в один файл. Надежда, которая помогает объяснить мою проблему немного лучше.

+2

Для того, чтобы мы могли помочь вам более легко, вы должны добавить образец вашего входного файла на вопрос. Кроме того, было бы хорошо видеть, что вы пробовали до сих пор. –

ответ

0

Вы должны иметь возможность использовать s.th. как это:

awk '{ line_date = $1/100; print > "out_" line_date ".txt"; }' 

BTW вы могли бы хотеть, чтобы избежать «бесполезно использовать кота», не обжигающе, но с использованием AWK непосредственно на файл.

0

YYMMDDHH 14071000

представьте YYMMDDHH находится на 1-м coloumn.

awk '{fn = substr($1, 1, 6) ; print $0 >> fn }' 1.txt 
0
awk '{print $0 >> "File" substr($1, 0, 6) ".txt"}' file 

Предполагая, что дата в первом столбце. Логика должна добавить каждую строку в соответствующий файл (имя файла - это дата в формате YYMMDD). Чтобы все данные, соответствующие каждой дате, были в соответствующем «FileYYMMDD.txt». Если дата находится в другом столбце, вы можете просто изменить $ 1 на номер столбца.

Пример вывода:

[email protected]:~/AMD/SO$ cat file 
14071000 asasaa 
14071022 iosido 
14071000 lsdksld 
14071022 sodisdois 
14071100 iwiwe 
14071022 iosido 
14071100 iwiwe 
14071200 yqiwyq 
[email protected]:~/AMD/SO$ awk '{print $0 >> "File" substr($1, 0, 6) ".txt"}' file 
[email protected]:~/AMD/SO$ ls 
file File140710.txt File140711.txt File140712.txt 
[email protected]:~/AMD/SO$ cat File140710.txt 
14071000 asasaa 
14071022 iosido 
14071000 lsdksld 
14071022 sodisdois 
14071022 iosido 
[email protected]:~/AMD/SO$ cat File140711.txt 
14071100 iwiwe 
14071100 iwiwe 
[email protected]:~/AMD/SO$ cat File140712.txt 
14071200 yqiwyq 
Смежные вопросы