UTCを含むISO-8601 CSVファイルを使用して定義された時間オフセット/中断/差(たとえば2時間)に基づいてミリ秒精度(例)+%FT%T.%3NZ
に分割する簡単な方法(ライナーなど)があるかどうか疑問に思います。2021-05-27T13:59:33.641Z
タイムスタンプ。
いつものように、これにはいくつかの方法があり、同様の質問を持つ他のユーザーにとっては、他のオプションも包括的な答えに関連する可能性があります。
GNU Bash 4.4.23
... git 2.31.1の、、、GNU sed 4.8
(GNU Awk 5.0.0
および一緒にバンドルされている他のすべてのツール)を有効/使用します。xsv 0.13.0
jq 1.6
Windows 7の場合- ...対話型シェルのスクリプトで使用することを好みます。
- ...セミコロン(
;
)を区切り文字として使用し、カンマを使用しないでください。 - ...するいいえ私の値の引用符(例、一重引用符()
'
または二重引用符()で"
囲む) - ...タイトルなし
- ...すべてのCSVを変数に保存し、結果をさらに分析できるように、結果を変数(配列?)に保存したいと思います。
- 私のコラムはいいえ実際には長さが固定されており、英数字に加えてスペースとハイフンを含めることができます。
- タイムスタンプは、実際のデータの8列のうち5番目です。
- ファイルが最大250,000行、20MiBであると仮定できます。
- スクリプト/コマンドが0.5秒未満である場合、i5-4300Uでより良いですが、最大5〜10秒は依然として取引の中断時間ではありません。
はい
分割のためのオフセットがあり、2 hours
何も難読化しない場合、このファイルは次のようになります。
abc;square;2021-05-27T14:15:39.315Z
def;circle;2021-05-27T14:17:03.416Z
ghi;triang;2021-05-27T14:45:13.520Z
abc;circle;2021-05-27T15:25:47.624Z
ghi;square;2021-05-27T17:59:33.641Z
def;triang;2021-05-27T18:15:33.315Z
abc;circle;2021-05-27T21:12:13.350Z
ghi;triang;2021-05-27T21:15:31.135Z
次の3つの部分に分けられます
abc;square;2021-05-27T14:15:39.315Z
def;circle;2021-05-27T14:17:03.416Z
ghi;triang;2021-05-27T14:45:13.520Z
abc;circle;2021-05-27T15:25:47.624Z
ghi;square;2021-05-27T17:59:33.641Z
def;triang;2021-05-27T18:15:33.315Z
abc;circle;2021-05-27T21:12:13.350Z
ghi;triang;2021-05-27T21:15:31.135Z
免責事項:私はネイティブスピーカーではないので、他の言葉に変えてこの質問を理解しやすくなったら、続けてください。長い返事。たとえば、マイユースケースに適用されないオプション(カンマ、引用符)を指定したり、semicolon
この質問のテキストに単語と記号の両方を使用したりすることもSEOの目的です。;
ベストアンサー1
変数の例CSVデータを考えると、次のようになります$csv
。
gawk '
function timestamp2epoch(ts, m) {
if(match(ts, /([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})\..*/, m))
return mktime(m[1] " " m[2] " " m[3] " " m[4] " " m[5] " " m[6])
else
return -1
}
BEGIN {
FS = ";"
interval = 2 * 3600 # 2 hours
}
{ t = timestamp2epoch($3) }
t > start + interval { start = t; n++ }
{ batch[n] = batch[n] (batch[n] == "" ? "" : "/") $0 }
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in batch)
print batch[i]
}
' <<<"$csv"
出力
abc;square;2021-05-27T14:15:39.315Z/def;circle;2021-05-27T14:17:03.416Z/ghi;triang;2021-05-27T14:45:13.520Z/abc;circle;2021-05-27T15:25:47.624Z
ghi;square;2021-05-27T17:59:33.641Z/def;triang;2021-05-27T18:15:33.315Z
abc;circle;2021-05-27T21:12:13.350Z/ghi;triang;2021-05-27T21:15:31.135Z
これはシェル配列として読み取ることができます。たとえば、次のようになります。
mapfile -t batches < <(gawk '...' <<<"$csv")
declare -p batches
declare -a batches=([0]="abc;square;2021-05-27T14:15:39.315Z/def;circle;2021-05-27T14:17:03.416Z/ghi;triang;2021-05-27T14:45:13.520Z/abc;circle;2021-05-27T15:25:47.624Z" [1]="ghi;square;2021-05-27T17:59:33.641Z/def;triang;2021-05-27T18:15:33.315Z" [2]="abc;circle;2021-05-27T21:12:13.350Z/ghi;triang;2021-05-27T21:15:31.135Z")
次に、次のように対話します。
for ((i = 0; i < "${#batches[@]}"; i++)); do
IFS="/" read -ra records <<<"${batches[i]}"
echo "batch $i"
for record in "${records[@]}"; do echo " $record"; done
echo
done
batch 0
abc;square;2021-05-27T14:15:39.315Z
def;circle;2021-05-27T14:17:03.416Z
ghi;triang;2021-05-27T14:45:13.520Z
abc;circle;2021-05-27T15:25:47.624Z
batch 1
ghi;square;2021-05-27T17:59:33.641Z
def;triang;2021-05-27T18:15:33.315Z
batch 2
abc;circle;2021-05-27T21:12:13.350Z
ghi;triang;2021-05-27T21:15:31.135Z