2015-06-14 2 views
0

У меня есть файл, который я пытаюсь преобразовать за считанные секунды. Это выглядит следующим образом:AWK конвертировать минуты и секунды только в

49.80 
1:03.40 
1:01.00 
1:00.40 
1:01.00 

Я пробовал:

awk -F: '{seconds=($1*60);seconds=seconds+$2;print seconds}' file 

, который выводит:

2988 
63.4 
61 
60.4 
61 

Я также попытался:

sed 's/^/:/g' file | awk -F: '{seconds=($2*60);seconds=seconds+$3;print seconds}' 

, который выводит как и результаты. Я хотел бы получить эти результаты:

49.80 
63.4 
61 
60.4 
61 

ответ

5

Просто добавьте чек, если записи содержит как секунды и минуты

awk -F: 'NF==1; NF==2{seconds=($1*60);seconds=seconds+$2;print seconds}' 
  • NF количество полей в каждой записи (строки).

  • NF==1 Если в нем содержится только одно поле, мы не собираемся делать никаких расчетов. См., Что нет никакой части {action}, связанной с этой проверкой. Следовательно, awk выполняет действие по умолчанию для печати всей строки

  • NF==2 Истинно, если строка содержит 2 поля. Принимает связанное действие, которое выполняет вычисления.

Тест

$ awk -F: 'NF==1; NF==2{seconds=($1*60);seconds=seconds+$2;print seconds}' file 
49.80 
63.4 
61 
60.4 
61 
+0

Спасибо nu11p01 *, это то, что мне было нужно. –

0

последняя колонка в ваших двоеточиях списка секунды, следующие за последние являются минутами и колонна перед ними находятся часы (хотя и не упоминалось ранее). Эта структура я поместил в код:

awk -F':' '{print (NF>2 ? $(NF-2)*3600 : 0) + (NF>1 ? $(NF-1)*60 : 0) + $(NF)}' 

Он проверяет, есть ли достаточное количество столбцов (например NF>1), а затем принимает значение (например, $(NF-1)*60 или даже 0).

Тест:

> awk -F':' '{print $0": "(NF>2?$(NF-2)*3600:0)+(NF>1?$(NF-1)*60:0)+$(NF)}' 
49.80: 49.8 
1:03.40: 63.4 
1:01.00: 61 
1:00.40: 60.4 
1:01.00: 61 
23:14:12.1: 83652.1 
1
$ awk -F: '{print (NF-1)*$1*60 + $NF}' file 
49.8 
63.4 
61 
60.4 
61 
+1

Хороший (+1), это было бы принято –

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