grep/sort/find を使用して一意の値を抽出する

grep/sort/find を使用して一意の値を抽出する

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を見つけます。

関連情報