毎日私はパスに16個のファイルを受け取ります/Home/h87654/file/
。各ファイルの最初の行には、今日の日付(YYYYMMDD)を含む文字列があります。日付の位置は固定されておらず、最初の行のどこでも可能です。最初の行の日付に基づいて、毎日最新のファイルが届くようにしたいと思います。
広範な質問についてお詫び申し上げます。
私はUNIXを初めて使用します。以下は私が作業しているコードです。
/Home/h87654/latest_file.txt これには、最初の行にその日付を含む 16 個のファイルがすべて含まれます。これらの16個のファイルの中から、タイムスタンプを含む最新のファイルをインポートする必要があります。たとえば、今日のスクリプトを実行すると、2018-06-11です。最初のループでは、開始日が20180501で終了日が20180531の最新の_file.txtには、最初の行に20180501を含むすべてのファイルが含まれます。ファイルの最後のエントリと対応するタイムスタンプが必要です。両方ともtime.txtに書き込みます。
2番目のループlatest_file.txtには、最初の行に20180502を含むすべてのファイルが含まれています。最後のファイルと対応するタイムスタンプが必要で、どちらもtime.txtに追加されます。
3番目のループでは、最新のファイル.txtに最初の行に20180503を含むすべてのファイルが含まれています。最後のファイルと対応するタイムスタンプが必要で、両方ともtime.txtに追加することで月末まで続きます。 $終了日
cd /Home/h87654/file/
start_date=`date -d "-1 month -$(($(date +%d)-1)) days" +%Y%m%d` ##start of month in yyyymmdd
end_date=`date -d "-$(date +%d) days " +%Y%m%d` ##end of month in yyyymmdd
while [ "$start_date" > "$end_date" ]; ##execute for each day for a monnth
do
awk 'FNR==1{if($0~"$start_date")print FILENAME;}' /Home/h87654/file/*.* >/Home/h87654/latest_file.txt ##check ist date in the first line and print the file name
##am stuck here .. idk how to proceed
done
答え1
正確に何を求めているのか分かりません。
最初の行に最大8桁の数字を含むファイルへのパスを取得するには、次のようにしますzsh
。
getdate() {
local MATCH
IFS= read -r < $REPLY && [[ $REPLY =~ '[[:digit:]]{8}' ]]
REPLY=$MATCH
}
printf '%s\n' /Home/h87654/file/*.*(O+getdate[1])
最大日付とその最大日付を最初の行の最初の8桁のシーケンスとして含むすべてのファイルをインポートするには、次のようにします。
typeset -A bydate
for file (/Home/h87654/file/*.*) {
IFS= read -r line < $file &&
[[ $line =~ '[[:digit:]]{8]' ]] &&
bydate[$MATCH]+=$file$'\n'
}
latest=${${(kO)bydate}[1]}
printf 'Latest date: %s\nFiles:\n%s' $latest $bydate[$latest]