YYYYMMDD.Txt
形式に応じて名前付きテキストファイルがたくさんあります(今日は20160420.Txt
)。
各ファイルはデフォルトでタイムスタンプと一意のIDを含むログであり、各値はタブ区切り文字で区切られています。
たとえば、20160420.Txt
次の値を使用します。
DATE TIME ID
20160420 0135 123456
20160420 0240 234567
20160420 1252 345678
このファイル内のすべての一意のIDを抽出する必要がありますが、過去6ヶ月間のみ抽出する必要があります。
問題は、すべてのファイルが先週再生成されたため、mtimeを使用できないことです(たとえば、mtimeはファイル名と一致しません)。
grep
//を使ってfind
これを行う方法はありますかsort
?
答え1
6ヶ月前の正確な日付を見つけるのは簡単ではありません。ただしfind
、これを使用して実行する方法を知っている場合は、-mtime
ファイル名の日付に基づいてファイルをタッチしただけです。
for x in *.Txt; do
dd=${x%.Txt}
touch -t "$dd"0000 "$x"
done
その後、使用mtime
答え2
使用アッこの仕事をして、SQLite日付のため。
sqlite3 <<< "select date('2016-04-20', '-6 month');"
2015-10-20
ダンディ、そうではありませんか? awkにはSQLiteに必要なハイフンを挿入/削除する文字列機能があり、タブ区切り文字に分割されています。
awk 'NR == 1 {next}; { IDS[$3]++ }; END {for (K in IDS) {print K}}' ids
123456
345678
234567
また、速い速度も保証されます。
答え3
他の答えに対する@casのコメントに対するフォローアップ:
six_months=$(date -d "6 months ago" "+%Y%m%d")
for f in *.Txt; do
file_date=${f%.Txt}
[[ $file_date > $six_months ]] && echo "$f"
done |
xargs awk 'FNR > 1 {print $3}' |
sort -u > unique_ids_in_last_6_months
forループは「限定された」ファイル名を出力します。 xargsはファイル名を一度に1つずつ一括してawkに渡します(awkへの呼び出しの数を最小限に抑えます)。 awk はヘッダーを破棄し、最後の列を印刷します。 sortはあなたの一意のIDを見つけます。