csvファイルから日付範囲を取得する方法はありますか?

csvファイルから日付範囲を取得する方法はありますか?

ディレクトリ内の4つのCSVファイルのそれぞれの日付範囲を見つけたいです。日付列は各csvの最後の列で、形式はです1/25/2012 7:20:55 PM

日付フィールドは、常に最後の列である24列です。各CSVのレコードのみが変更されます。そして日付が決まりました。

各ファイルに対してこれを行い、最終範囲を取得する方法はありますか(日付がソートされていると仮定)?

したがって、最初の記録が2012年1月25日午後7時20分55秒である場合、最後の記録は2016年11月7日午後2時36分20秒です。

出力日付範囲を2012年1月25日から2016年11月7日までに設定したいと思います。しかし、4つのファイルの日付範囲をすべてマージしたいと思います。

入力例(簡潔にするために一部の列は省略):

  • 最初のファイル:

    123,...,コラム23,col24_time
    123,...,23、2012年1月25日午後7時20分
    123,...,23、2012/1/26午前10:57
    123,...,23、2012年1月26日午後2時20分
    123,...,23、2012年1月30日午前11時55分
    123,...,23、2012年1月30日午後3時17分
    123,...,23、2012年1月30日午後5時36分
    123,...,23、2012年1月30日午後8時16分
    ...
    123,...,23、2012年4月11日午前11時45分
    123,...,23、2012年4月11日午後2時23分
  • 中間ファイル

  • 最後のファイル:

    123,...,23、2015年3月11日午前4時45分
    123,...,23、2015年3月11日午前8時40分
    ...
    123,...,23、2016年11月7日午後2時36分

各ファイルにはほぼ5〜10Kレコードがあります。日付はファイル内で順次ソートされます。各ファイルの各列にはヘッダーがあります。

このコマンドの出力は次のhead -n7 Files/file1.csv | cut -d, -f24とおりです。

"col24_time"
"2012-01-01 00:30:26"
"0"
"2012-01-01 02:00:37"
"0"
"0"
"https://external.xx.fbcdn.net/safe_image.php?" <<-- previous column record?

ベストアンサー1

私はまだその質問を理解しているかどうかわかりません。しかし、指定された入力に基づいて目的の出力を生成するコードは次のようになり、他の答えよりはるかに短いです。

datetime1=$(head -n1 file1.csv | cut -d, -f24)
datetime4=$(tail -n1 file4.csv | cut -d, -f24)
printf '%s - %s\n' "${datetime1%% *}" "${datetime4%% *}"

その後、最初のファイルから最初の行を取得し、4番目と最後のファイルから最後の行を取得し、24番目のフィールドを抽出します(基準:,それぞれの区切り記号)。具体的には1/25/2012 7:20 AM日付/時刻文字列です11/7/2016 2:36 PM。次に、最初のスペースとその後のすべての内容を削除して、各単語の最初の「単語」を印刷します。必須の日付です。

これは準行のようなものです。読みやすくするために3行に分けましたが、論理的には長いコマンドです。

printf '%s - %s\n' \
        "$(head -n1 file1.csv | cut -d, -f24 | cut -d' ' -f1)" \
        "$(tail -n1 file4.csv | cut -d, -f24 | cut -d' ' -f1)"

ここでは変数を使用しないため、パラメータ拡張は使用できないため、2番目を使用して24番目のフィールドの最初の「単語」を抽出しました  cut

おすすめ記事