Конвертировать текст в формат времени, используя скрипт bash - PullRequest
0 голосов
/ 20 марта 2019

Я новичок в сценариях оболочки .. У меня есть файл с разделителями табуляции, например,

0018803 01  1710    2050    002571      
0018951 01  1934    2525    003277  
0019362 02  2404    2415    002829  
0019392 01  2621    2820    001924  
0019542 01  2208    2413    003434  
0019583 01  1815    2134    002971  

Здесь 3-й и 4-й столбцы представляют время начала и время окончания.

Я хочу преобразовать эти два столбца в правильный таймфрейм, чтобы получить 6-й столбец как точную разницу во времени между столбцом 4 и столбцом 3 в часах и минутах.

Столбец 6 Результат будет 3:40, 5:51, 00:11, 1:59, 2:05.

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Простое решение bash с использованием арифметического расширения:

while IFS='' read -r l; do
        IFS=' ' read -r _ _ st et _ <<<"$l"
        d=$(( (10#${et:0:2} * 60 + 10#${et:2:2}) - (10#${st:0:2} * 60 + 10#${st:2:2}) ))
        printf "%s %02d:%02d\n" "$l" "$((d/60))" "$((d%60))"
done < intput_file_path

выведет:

0018803 01  1710    2050    002571   03:40
0018951 01  1934    2525    003277   05:51
0019362 02  2404    2415    002829   00:11
0019392 01  2621    2820    001924   01:59
0019542 01  2208    2413    003434   02:05
0019583 01  1815    2134    002971   03:19
2 голосов
/ 20 марта 2019

В одну сторону с awk:

$ cat test.awk
# create a function to split hour and minute
function f(h, x) {
    h[0] = substr(x,1,2)+0
    h[1] = substr(x,3,2)+0
}

{
    f(start, $3);
    f(end, $4);
    span  = end[1] - start[1] > 0 \
          ? sprintf("%d:%02d", end[0]-start[0], end[1]-start[1]) \
          : sprintf("%d:%02d", end[0]-start[0]-1, 60+end[1]-start[1]);
    print $0 OFS span
}

затем запустите файл awk следующим образом:

$ awk -f test.awk input_file

Редактировать: По предложению @glenn Jackman, код может быть упрощен (см. Метод @Kamil Cuk):

function g(x) {
    return substr(x,1,2)*60 + substr(x,3,2)
}

{
    span = g($4) - g($3)
    printf("%s%s%d:%02d\n", $0, OFS, int(span/60), span%60)
}
1 голос
/ 20 марта 2019

Вот один в GNU awk, использующий функции времени , mktime для преобразования в время эпохи и strftime для преобразования времени в желаемый формат HH:MM:

$ awk -v OFS="\t" '{
    dt3="1970 01 01 " substr($3,1,2) " " substr($3,3,2) " 00"
    dt4="1970 01 01 " substr($4,1,2) " " substr($4,3,2) " 00"
    print $0,strftime("%H:%M",mktime(dt4)-mktime(dt3),1)      # thanks @glennjackman,1 :)
}' file

Вывод (только 6 долларов):

03:40
05:51
00:11
01:59
02:05
03:19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...