Преобразование таблицы с положительными и отрицательными значениями для абсолютных значений

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

#!/usr/bin/env bash

f=$(head -n 1 custom_log_format.log)
base=$(sed 's/.*H:M:S \(.*\) D:M:Y.*/\1/' <<<$f)

OLDIFS=$IFS
IFS=$'n' 
readarray lines < custom_log_format.log
IFS=$OLDIFS
for i in ${!lines[@]}
do
    b="${lines[$i]}"
    if [[ $b == "["* ]]
    then
        rel_time=$(sed 's/^\[\(.*[^ ]\)\].*/\1/' <<<$b)
        time=$(echo $rel_time | awk -F: '{ print ($1 * 60) + $2 * 60 }')
        # convert base to seconds
        base_seconds=$(date -d"$base" +"%s")
        new_time_seconds=$(( base_seconds + time ))

        new_time=$(date -d"@$new_time_seconds" +"%H:%M:%S")
    fi
    echo ${b/$rel_time/$new_time}
done

output

Timestamp H:M:S 15:4:1 D:M:Y 16:1:2015
Firmware Version: 121020150140
[15:09:01]------------[ Logs ]------------
[15:11:01]Device Data: -> Supported Attributes -> 0x8033B
[15:09:01]Device Cleanup

[15:27:01]SendClearMsg ...
[15:31:01]Param:GetData failed
[15:59:01]Current Update Count:7
[15:10:01]MODECHK:Normal mode
0
07.10.2018, 05:26
2 ответа

Вы можете использовать sedследующим образом:

sed 's/-//g' file | column -t

Вы можете использовать awkследующим образом:

awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }' file | column -t

NUMBER  SQUARE  SQUARE  ROOT
1       1       1.000
2       4       1.414
3       9       1.732
4       16      2.000
5       25      2.236
6       36      2.449
7       49      2.646
8       64      2.828
9       81      3.000
10      100     3.162
11      121     3.317
12      144     3.464
13      169     3.606
14      196     3.742
1
28.01.2020, 02:42

Если все, что вам нужно, это сделать все значения положительными, просто удалите все тире.

$ <infile sed 's/-//g'
NUMBER  SQUARE  SQUARE ROOT
1  1   1.000
2   4  1.414
3  9  1.732
4  16 2.000
5   25  2.236
6   36 2.449
7  49  2.646
8  64  2.828
9   81 3.000
10  100    3.162
11 121 3.317
12 144    3.464
13  169 3.606
14 196    3.742

Если вам нужны значения в красивых столбцах, добавьте column -t(, но также измените строку заголовка, чтобы сделать третью запись одним словомSQUARE_ROOT):

<infile sed 's/-//g' | column -t
NUMBER  SQUARE  SQUARE_ROOT
1       1       1.000
2       4       1.414
3       9       1.732
4       16      2.000
5       25      2.236
6       36      2.449
7       49      2.646
8       64      2.828
9       81      3.000
10      100     3.162
11      121     3.317
12      144     3.464
13      169     3.606
14      196     3.742

Все можно сделать одним вызовом awk:

$ awk 'NR==1;NR!=1{gsub(/-/,"");printf("%5g %8g %11.3f\n",$1,$2,$3)}' infile
NUMBER  SQUARE  SQUARE_ROOT
    1        1       1.000
    2        4       1.414
    3        9       1.732
    4       16       2.000
    5       25       2.236
    6       36       2.449
    7       49       2.646
    8       64       2.828
    9       81       3.000
   10      100       3.162
   11      121       3.317
   12      144       3.464
   13      169       3.606
   14      196       3.742
0
28.01.2020, 02:42

Теги

Похожие вопросы