非常に大きなログファイルがあり、開始時刻と終了時刻を呼び出す必要があります。
Bigfile.txt
:
2021-02-24 14:21:34,630;START
2021-02-24 14:21:35,529;END
2021-02-24 14:57:05,600;START
2021-02-24 14:57:06,928;END
2021-02-24 15:46:45,894;START
2021-02-24 15:46:46,762;END
2021-02-24 17:49:20,925;START
2021-02-24 17:49:26,243;END
2021-02-24 18:32:18,166;START
2021-02-24 18:32:18,969;END
この形式で3番目のファイルを作成する必要があります(START(大ファイルの1行)、END(大ファイルの2行)、Duration(秒単位で報告された違い)の3つの列で構成されています)。
Outputfile.txt
:
2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0,899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1,328
ファイル全体について。誰でも私を助けることができますか? Bashスクリプトで動作するようにどのように設定しますか?誰かが私にも説明できれば:D
すべてのサポートに感謝します。
答え1
私はGNUについて次の提案をしますawk
:
awk -F'[,;]' \
# odd lines (START)
'NR%2 == 1 {
# set a to date an miliseconds
a = $1","$2
# set d1 to date replacing - and : for spaces
d1 = gensub(/[-:]/," ","g",$1)
# set m1 to miliseconds
m1 = $2
}
# even lines (END)
NR%2 == 0 {
OFS=";"
# the same as before...
b = $1","$2
d2 = gensub(/[-:]/," ","g",$1)
m2 = $2
# set c and d to seconds and miliseconds
c = mktime(d2)"."m2
d = mktime(d1)"."m1
# print
print a, b, c-d
}' file
出力:
2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0.899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1.328
2021-02-24 15:46:45,894;2021-02-24 15:46:46,762;0.868
2021-02-24 17:49:20,925;2021-02-24 17:49:26,243;5.318
2021-02-24 18:32:18,166;2021-02-24 18:32:18,969;0.803
答え2
一方bash
通行。あなたはそれが動作するようにする必要がありますbc
。
#!/bin/bash
# For each line of the file
while read line; do
if [ "${line#*;}" = "START" ]; then
# We are in a start record
# Save the whole line less the START token
whole_start="${line%;*}"
# Get the start time as : sec,ms
start_time="${whole_start##*:}"
# swap , with . for bc
start_time="${start_time/,/.}"
# ... And go to the next round
continue
else
# We are in the END round, do the same
whole_end="${line%;*}"
end_time="${whole_end##*:}"
end_time="${end_time/,/.}"
fi
# Obtain the ms and add the leading 0 if it miss
ms_diff=`echo "scale=3; $end_time - $start_time" | bc | sed '/^\./ s/.*$/0&/'`
echo "$whole_start;$whole_end;$ms_diff"
done < ./your_file.csv
出力をファイルにリダイレクトすると、目的の結果が得られます。
2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0.899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1.328
2021-02-24 15:46:45,894;2021-02-24 15:46:46,762;0.868
2021-02-24 17:49:20,925;2021-02-24 17:49:26,243;5.318
2021-02-24 18:32:18,166;2021-02-24 18:32:18,969;0.803