ディレクトリ内の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つのファイルの日付範囲をすべてマージしたいと思います。
入力例(簡潔にするために一部の列は省略):
最初のファイル:
列1、2列、3列,...,コラム23,col24_time 値1、値2、値3,...,値23、2012年1月25日午後7時20分 値1、値2、値3,...,値23、2012/1/26午前10:57 値1、値2、値3,...,値23、2012年1月26日午後2時20分 値1、値2、値3,...,値23、2012年1月30日午前11時55分 値1、値2、値3,...,値23、2012年1月30日午後3時17分 値1、値2、値3,...,値23、2012年1月30日午後5時36分 値1、値2、値3,...,値23、2012年1月30日午後8時16分 ... 値1、値2、値3,...,値23、2012年4月11日午前11時45分 値1、値2、値3,...,値23、2012年4月11日午後2時23分
中間ファイル
最後のファイル:
値1、値2、値3,...,値23、2015年3月11日午前4時45分 値1、値2、値3,...,値23、2015年3月11日午前8時40分 ... 値1、値2、値3,...,値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
。