Сценарии оболочки UNIX: разбить текстовый файл по его записям - PullRequest
2 голосов
/ 02 марта 2011

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

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

Спасибо заранее, Alex

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

Использование awk:

awk '{print  > "data"substr($1,0,8)".dat"}' myfile
1 голос
/ 02 марта 2011

Это должно работать, если элементы в последовательности дат:

date=20090101 # Change to the earliest date
while IFS= read -rd $'\n' line
do
    if [ "$(echo "$line" | cut -d ' ' -f 1 | cut -c 1-8)" -eq $date ]
    then
        echo "$line" >> "$date.dat"
    else
        let date++
    fi
done < log.dat
0 голосов
/ 02 марта 2011

С предостережениями, что каждый день должен иметь более 1 записи, и что выходной файл будет иметь пустые строки:

uniq --all-repeated=separate -w8 file | csplit -s - '/^$/' '{*}'

У нас действительно должна быть опция uniq для вывода даже uniq записей.Также csplit должен иметь возможность подавить совпавшую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...