はい

はい

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.8GNU Awk 5.0.0および一緒にバンドルされている他のすべてのツール)を有効/使用します。xsv 0.13.0jq 1.6Windows 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

おすすめ記事