最後に処理された勤務日を取得するためのAwkファイルの処理

最後に処理された勤務日を取得するためのAwkファイルの処理

私のアプリケーションは入力XMLに基づいており、入力ファイルを処理し、処理後にstatus_file.txtにステータスを追加します。

各XMLファイルの最後の処理日を識別し、それを別のスクリプトに入力として提供するスクリプトを作成しています。

私は2種類のXMLを配布します。

    1. 週末処理サポート(test2.xml
    1. 週末処理はサポートされていません。 ( test1.xml)

週末処理を有効にするXMLの例 -test2.xml

<?xml version="1.0"?>
<Company>
  <Employee>
      <FirstName>Test</FirstName>
      <ContactNo>1234567890</ContactNo>
      <Address>
      <WeekendProcessing>True</WeekendProcessing>
      </Address>
  </Employee>
</Company>

週末処理を無効にするXMLの例 -test1.xml

<?xml version="1.0"?>
<Company>
  <Employee>
      <FirstName>Test</FirstName>
      <ContactNo>1234567890</ContactNo>
      <Address>
      <WeekendProcessing>False</WeekendProcessing>
      </Address>
  </Employee>
</Company>

サンプルstatus_file.txt

INPUT_NAME1,INPUT_NAME2,Procecessed_DATE
test1.xml,AAAA,BBBB,20201024
test1.xml,AAAA,CCCC,20201025
test2.xml,AAAA,BBBB,20201024
test1.xml,EFGH,IJKL,20201023
test1.xml,AAAA,BBBB,20201024
test2.xml,AAAA,CCCC,20201021
test1.xml,AAAA,BBBB,20201022 
test2.xml,AAAA,BBBB,20201022
test1.xml,EFGH,IJKL,20201023

以下は、XMLの最後の処理日を取得したいコマンドです。

LPD=$(cat status_file.txt | grep <XML_NAME> | awk -F "," '{print $NF}' | sort | uniq)

注:ここでの作業日は、月曜日から金曜日までの作業日を意味します。

週末処理をサポートするXMLで動作します。しかし、週末処理をサポートしていないXMLの平日の最後の処理を識別するのは困難です。注:週末の日付を含むXMLエントリは平日にも表示されます。

また、時には週末に2つ以上のエントリを取得できるため、sortおよびtail -2ロジックを使用できません。

予想される結果:

# script <test1.xml> - I should get last processed weekday
O/p Required - 20201023
# script <test2.xml> - I should get last processed day either weekday/weekend
O/p Required - 20201025

答え1

awkGNUといくつかのヒントを使ってXMLを解析しますxmllint

#!/bin/bash

input_file="$1"
status_file="status_file.txt"

weekend="True"
weekend="$(xmllint --xpath "//WeekendProcessing/text()" "$1")"

awk -F, -v f="$input_file" -v weekend="$weekend" '
$1 == f && $NF > max {
    if (weekend == "True") {
        max = $NF
    } else {
        d = mktime(substr($NF,1,4)" "substr($NF,5,2)" "substr($NF,7)" 00 00 00")
        if (strftime("%u",d) < 6) max = $NF
    }
}
END {print max}
' "$status_file"

テスト:

> bash test.sh test1.xml
20201023
> bash test.sh test2.xml
20201024

メモ:

  • 私はシングルパス選択でノードのテキスト値を抽出したことがありますxmllintWeekendProseccingxmlファイルから値を取得する好みの方法で置き換えることができます。

  • 行をソートせずにファイルを一度解析するので、速度も速くなります。私たちは外部日付コマンドを呼び出すことはありません。の場合、weekend="True"最大日付を保持します。それ以外の場合は、weekend="False"以下を使用します。GNU awk 日時関数。日付を生成し、mktime()1〜7の範囲の数値を返すformat:を使用して曜日をテストします(1は月曜日を意味します)。したがって、見つかったより高い日が土曜日または日曜日でない場合にのみ最大値を更新します。strftime()%u

関連情報