내 응용 프로그램은 입력 XML을 기반으로 하며 입력 파일을 처리하고 처리 후 status_file.txt에 상태를 추가합니다.
각 XML 파일의 마지막 처리 날짜를 식별하고 이를 다른 스크립트에 입력으로 제공하는 스크립트를 작성 중입니다.
저는 두 가지 유형의 XML을 배포합니다.
-
- 주말 처리 지원 (
test2.xml
)
- 주말 처리 지원 (
-
- 주말 처리는 지원되지 않습니다. (
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
awk
GNU 와 몇 가지 도움말을 사용하여 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
.WeekendProseccing
xml 파일에서 값을 가져오는 선호하는 방법으로 바꿀 수 있습니다.우리는 줄을 정렬하지 않고 파일을 한 번 구문 분석하므로 속도도 더 빠릅니다. 우리는 외부 날짜 명령을 호출하지 않습니다. 의 경우
weekend="True"
최대 날짜를 유지합니다. 그렇지 않으면,weekend="False"
우리는 다음을 사용합니다.GNU awk 날짜 및 시간 함수. 날짜를 생성하고mktime()
1-7 범위의 숫자를 반환하는 format:을 사용하여 요일을 테스트합니다(1은 월요일을 의미함). 따라서 발견된 더 높은 날이 토요일이나 일요일이 아닌 경우에만 최대값을 업데이트합니다.strftime()
%u