Это добавляет относительные числа, созданные вашим пользовательским файлом журнала, к исходному базовому числу и обновляет все строки
#!/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
Вы можете использовать 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
Если все, что вам нужно, это сделать все значения положительными, просто удалите все тире.
$ <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