ファイルの最初の行に基づいて、ファイルセットから最新のタイムスタンプを取得します。

ファイルの最初の行に基づいて、ファイルセットから最新のタイムスタンプを取得します。

毎日私はパスに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]

関連情報