마지막으로 처리된 근무일을 가져오기 위한 Awk 파일 처리

마지막으로 처리된 근무일을 가져오기 위한 Awk 파일 처리

내 응용 프로그램은 입력 XML을 기반으로 하며 입력 파일을 처리하고 처리 후 status_file.txt에 상태를 추가합니다.

각 XML 파일의 마지막 처리 날짜를 식별하고 이를 다른 스크립트에 입력으로 제공하는 스크립트를 작성 중입니다.

저는 두 가지 유형의 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

노트:

  • 나는 단일 경로 선택을 통해 노드의 텍스트 값을 추출한 적이 있습니다 xmllint. WeekendProseccingxml 파일에서 값을 가져오는 선호하는 방법으로 바꿀 수 있습니다.

  • 우리는 줄을 정렬하지 않고 파일을 한 번 구문 분석하므로 속도도 더 빠릅니다. 우리는 외부 날짜 명령을 호출하지 않습니다. 의 경우 weekend="True"최대 날짜를 유지합니다. 그렇지 않으면, weekend="False"우리는 다음을 사용합니다.GNU awk 날짜 및 시간 함수. 날짜를 생성하고 mktime()1-7 범위의 숫자를 반환하는 format:을 사용하여 요일을 테스트합니다(1은 월요일을 의미함). 따라서 발견된 더 높은 날이 토요일이나 일요일이 아닌 경우에만 최대값을 업데이트합니다.strftime()%u

관련 정보