Использование bash для разбора файла с поиском первых уникальных значений - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть CSV-файл, который я пытаюсь проанализировать в Bash.Первое поле каждой строки - это отметка времени в формате гггг-мм-дд чч: мм: сс.Каждые 10 минут создаются шесть строк, ниже я добавил небольшую выборку.

Я пытаюсь получить первые 6 строк из каждого дня.Первая запись для каждого дня может происходить в любое время между 00: 00: xx и 00: 10: xx, поэтому grep для «00: 0» не работает.

2010-04-23 00: 04: 43,0.0,0,4666724,3217665,28866,28866,0,92,65,
2010-04-23 00: 04: 43,0,1,0, 4666724,3217663,20832,20832,0,62,65,
2010-04-23 00: 04: 43,0,2,0,4666724,3217662,14702,14702,0,46,65,
2010-04-23 00: 04: 43,0,3,0,4666724,3217664,27739,27739,0,92,65,
2010-04-23 00: 04: 43,0,4,0,4666724,3217664,25105,25105,0,77, 65,
2010-04-23 00: 04: 43,0,5,0,4666724,3217664,24546,24546,0,77,65,
2010-04-23 00: 14: 43,0,0,0, 4666724,3217665,29226,29226,0,92,65,
2010-04-23 00: 14: 43,0,1,0,4666724,3217663,21552,21552,0,62,65,
2010-04-23 00: 14: 43,0,2,0,4666724,3217662,15422,15422,0,46,65,
2010-04-23 00: 14: 43,0,3,0,4666724,3217664,28459,28459,0,92, 65,
2010-04-23 00: 14: 43,0,4,0,4666724,3217664,25825,25825,0,77,65,
2010-04-23 00: 14: 43,0,5,0, 4666724,3217664,25266,25266,0.77,65,
2010-04-23 00: 24: 43,0,0,0,4666724,3217665,29586,29586,0,92,65,
2010-04-23 00: 24: 43,0,1,0,4666724,3217663,22272,22272,0,77,65,
и т. Д. До
2010-04-24 00: 05: 02,0.0,0,4666724,3217701,71388,71388,2.31,65,
2010-04-24 00: 05: 02,0,1,0,4666724,3217701,70264, 70264,21,35,
2010-04-24 00: 05: 02,0,2,0,4666724,3217700,61254,61254,2,00,65,
2010-04-24 00:05:02, 0,3,0,4666724,3217701,71011,71011,2.31,65,
2010-04-24 00: 05: 02,0,4,0,4666724,3217701,68111,68111,2.15,65,
2010-04-24 00: 05: 02,0.5,0,4666724,3217702,69904,69904,21,35,

Идеи, комментарии?Боб

Ответы [ 4 ]

2 голосов
/ 22 апреля 2011

awk-версия ответа eugene y

awk '
    $1 != date {count = 0; date = $1} 
    ++count <= 6 {print}
' filename
1 голос
/ 21 апреля 2011

Это должно быть легко с Perl:

perl -ane '$l = 0 if $F[0] ne $d; print if $l++ < 6; $d = $F[0]' file
1 голос
/ 21 апреля 2011

В следующем примере используется read с пользовательской настройкой IFS (= Разделитель полей ввода), чтобы разделить строку ввода на поле даты и времени, а затем все остальное, затем извлечь дату из даты-времени ISO, используя bash. 'оператор подстроки, а затем в основном продолжает печатать следующие N строк. Вместо echo вы можете захотеть поместить любую обработку, которую вы выполняете, в результат, потому что read + echo не сохраняет ввод точно.

function first_n_of_each_day() {
    local N="$1"
    local lastDateTime=""
    local I=0
    while IFS=',' read DATETIME OTHER ; do
        local DATE="${DATETIME:0:10}"
        if [ "$DATE" != "$lastDateTime" ] ; then
            I=0
            lastDateTime="$DATE"
        fi
        if [ $I -lt "$N" ] ; then
            let ++I
            # line matches:
            echo "$DATETIME,$OTHER"
        fi
    done
}
first_n_of_each_day 6 < file.csv
1 голос
/ 21 апреля 2011

Это может быть так же просто, как использовать grep с двумя шаблонами:

grep -e " 00:0" -e " 00:10" myFIle.csv

1-й шаблон будет совпадать с 00:00 до 00:09, а 2-й шаблон найдет 00:10.

...