CSVがあり、7日より古いすべての行を削除する必要があります。これはcsv形式です。
個人ID VIP CS SS LT FTLT PS修正日スタンプ T001028 1 1 1 0 0 0 05-07-2013 T001250 1 1 1 0 0 0 08-05-2012 T001261 1 1 1 0 0 1 2013年4月4日 T001345 1 1 1 0 0 0 2013年4月3日 T078503 1 1 1 0 0 0 04-03-2013 T079819 1 1 1 0 0 1 2013年3月22日 T080119 1 1 1 0 0 1 2013年4月2日 T090574 1 1 1 0 0 0 2012年11月15日 T091106 1 1 1 0 0 1 2013年3月22日
変更された日付列の形式はMM / DD / YYYYです。どんなアイデアでも良いです。 RedHat 5 Linuxシステムでタスクを実行しようとしています。
ベストアンサー1
tail
date -d ...
、awk
およびBash機能を使用する方法は次のとおりです。
tail -n+2 file.csv | {
while read line ; do
tmstmp=$(echo "$line" | awk '{print $8}');
[ $(( $(date -d "now" +%s) - $(date -d "$tmstmp" +%s) )) -lt $(( 60*60*24*7 )) ] && echo "$line";
done;
}
どのように動作しますか?
上記のコードはファイルの行を解析し、file.csv
8番目の列(日付)を取得し、エポック以降の秒数と解析された日付の間のデルタを計算します。 7日秒未満の場合、行は印刷されます。
デバッグ
何が起こっているのかをデバッグするためにこの行を置くことができます。tmpstmp=...
次の行の後に入れてください。
echo "TMSTMP: $tmstmp" "TMDELTA: $(( $(date -d "now" +%s) - $(date -d "$tmstmp" +%s) ))" "TMWINDOW: $(( 60*60*24*7 ))"
はい
簡単にするために、上記の内容をスクリプトに入れて名前を付けましたrprttime.bash
。
#!/bin/bash
tail -n+2 file.csv | {
while read line ; do
tmstmp=$(echo "$line" | awk '{print $8}');
echo "TMSTMP: $tmstmp" "TMDELTA: $(( $(date -d "now" +%s) - $(date -d "$tmstmp" +%s) ))" "TMWINDOW: $(( 60*60*24*7 ))"
[ $(( $(date -d "now" +%s) - $(date -d "$tmstmp" +%s) )) -lt $(( 60*60*24*7 )) ] && echo "$line";
done;
}
今実行すると:
$ ./rprttime.bash
TMSTMP: 05/07/2013 TMDELTA: 5157421 TMWINDOW: 604800
TMSTMP: 08/05/2012 TMDELTA: 28917421 TMWINDOW: 604800
TMSTMP: 04/04/2013 TMDELTA: 8008621 TMWINDOW: 604800
TMSTMP: 04/03/2013 TMDELTA: 8095021 TMWINDOW: 604800
TMSTMP: 04/03/2013 TMDELTA: 8095021 TMWINDOW: 604800
TMSTMP: 3/22/2013 TMDELTA: 9131821 TMWINDOW: 604800
TMSTMP: 04/02/2013 TMDELTA: 8181421 TMWINDOW: 604800
TMSTMP: 11/15/2012 TMDELTA: 20101021 TMWINDOW: 604800
TMSTMP: 3/22/2013 TMDELTA: 9131821 TMWINDOW: 604800
期間を7日から60日に変更してデバッグ行を無効にすると、次の行が印刷されることがわかります。
$ date
Fri Jul 5 16:49:19 EDT 2013
$ ./rprttime.bash
T001028 1 1 1 0 0 0 05/07/2013