Я пытаюсь проанализировать огромный текстовый файл (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
Предполагая, что файл отсортирован и даты всегда присутствуют, это должно работать:
#!/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
.
Я бы использовал {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
Это могло, вероятно, работать на Вас:
awk '{d=substr($1, 1, 8); fn = "data" d ".dat"; print $0 >> fn}' hugefile