2016-09-12 4 views
1

У меня есть список, где первая цифра 6 - дата в формате yyyymmdd. Следующие 4 цифры являются частью метки времени. Я хочу выбрать только те числа, которые являются максимальными временными метками для любого дня.найти максимум от частичной строки

20160905092900 
20160905212900 
20160906092900 
20160906213000 
20160907093000 
20160907213000 
20160908093000 
20160908213000 
20160910093000 
20160910213100 
20160911093100 
20160911213100 
20160912093100 

Средство, указанное выше, должно содержать нижеследующий список.

20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 
+0

Предполагая, что вход всегда находится в возрастающем временном порядке, то, что вы хотите, это запись перед каждым изменением первых 8 символов (в день), правильно? Используйте substr. –

ответ

0

Вы можете использовать AWK:

awk '{ 
    dt = substr($0, 1, 8) 
    ts = substr($0, 9, 12) 
} 
ts > max[dt] { 
    max[dt] = ts 
    rec[dt] = $0 
} 
END { 
    for (i in rec) 
     print rec[i] 
}' file  

20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 

Мы используем ассоциативный массив max, который использует первые 8 символов в качестве основных и последующих 4-х символов, как значение. Этот массив используется для хранения максимального значения временной отметки для заданной даты. Другой массив rec используется для хранения полной строки для даты, когда мы сталкиваемся с значением метки времени, превышающим сохраненное значение в массиве max.

1
$ sort -r file | awk '!seen[substr($0,1,8)]++' | sort 
20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 

Если файл уже отсортирован вы можете использовать tac вместо sort.

Смежные вопросы