Разделите текстовый файл его записями


Я пытаюсь проанализировать огромный текстовый файл (1.6 ГБ), строки данных которых похожи на это:

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, 18-го января).
Как я могу разделить этот файл на части согласно дате?

Все, что я знаю, было бы к grep file '20090118*' > data20090118.dat , но там уверенный путь состоит в том, чтобы сделать все даты сразу, правильно?

Количество записей на дату отличается, таким образом с помощью split с постоянным числом не будет работать.

Заранее спасибо,
Alex

2
задан 2 March 2011 в 16:42

3 ответа

Предполагая, что файл отсортирован и даты всегда присутствуют, это должно работать:

#!/bin/bash

base_dir='./'    

while read line; do
    date="${line:0:8}"
    echo "$line" >> "$base_dir$date.txt"
done < "$1"

[Сохраните его как my_splitter, сделайте его исполняемым, запустив chmod +x my_splitter, затем назовите его как [ 113]]

Он читает строку входного файла построчно, извлекает дату и использует ее для добавления строк с одинаковой датой в один и тот же файл.

base_dir - это целевой каталог, и файлы будут иметь форму <date>.txt. Примечание: существующие файлы не будут перезаписаны, новые строки будут добавлены из-за перенаправителя >>, поэтому лучше убедиться, что целевой каталог не содержит файлов вида <date>.txt.

0
ответ дан 2 March 2011 в 16:42

Я бы использовал {x..y}, может быть для каскада y, m, d, shema:

for d in {18..19} ; do grep 200901$d datadata; echo; done 
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

20090119025859 -2.400000 78.100000 1023.200000 0.000000
20090119025900 -2.500000 78.100000 1023.200000 0.000000
20090119025901 -2.400000 78.100000 1023.200000 0.000000
0
ответ дан 2 March 2011 в 16:42

Это могло, вероятно, работать на Вас:

awk '{d=substr($1, 1, 8); fn = "data" d ".dat"; print $0 >> fn}' hugefile
1
ответ дан 2 March 2011 в 16:42

Другие вопросы по тегам:

Похожие вопросы: