RCTI- 형식의 주문 번호 필드와 주문 번호를 구성하는 영숫자 문자가 포함된 "공급업체 송장 번호"로 시작하는 줄이 포함된 텍스트 파일 "invoice.txt"가 있습니다.
다음 명령을 입력하면:
awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' /mnt/path/invoice.txt
명령줄이나 bash의 스크립트에서 실행하면 REA-0130193/2와 같은 송장 번호가 반환됩니다(RCTI- 다음 부분만 필요합니다. 이 경우는 정확합니다). 각 실행 시 전체 송장 파일 수에 대해 작업하는 대신 새 파일에 대해 inotifywait
디렉터리에 도착하는 새 텍스트 파일에 대해서만 작업하는 것을 포함하는 새 스크립트에 이를 통합했습니다.
inotifywait -m /mnt/path -e create -e moved_to |
while read path action file; do
i="$path$file"
echo "$i"
orderno="$(awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' $i)"
echo "$orderno">>test.txt
done
이 방법도 작동합니다. 텍스트 파일이 도착하면 "test.txt"에 새 주문 번호가 생성됩니다. 그러나 다음을 호출하여 이 명령이 포함된 스크립트를 실행하면:
~/script.sh& or ~/script.sh &
다른 스크립트에서, 이 경우 나는 대가로 아무것도 얻지 못하고 그것은 나를 미치게 만듭니다. 스크립트 내의 스크립트일 때 작동이 중지되지만 터미널이나 백그라운드에서 직접 실행하면 제대로 작동하는 이유를 아는 사람이 있습니까?
나를 더욱 혼란스럽게 하는 것은 다음 형식 중 하나를 포함하여 다른 awk 명령이 동일한 script.sh에서 계속 작동한다는 것입니다.
paidamount="$(awk '/Payment Amt/ {gsub(",","",$11) ; print $11;exit}' $i)"
echo "$paidamount">>test.txt
특수문자 관련 우려로 인해 다음 내용으로 별도의 orderno.awk 파일을 만들었습니다.
#! /usr/bin/awk -f
/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}
그리고 전화해봐
orderno="$(~/orderno.awk $i)"
동일한 스크립트 내에서는 동작이 변경되지 않습니다.
명령을 다음과 같이 작성하십시오.
orderno="$(awk '/Vendor Invoice No/ {gsub(/RCTI-/,"",$4) ; print $4 ; exit}' $i)"
나는 차이를 볼 수 없습니다.
답변1
따라서 Gordon Davisson이 제안한 대로 inotifywait 줄을 다음과 같이 변경하십시오.
inotifywait -m /mnt/path -e close_write | while read path action file; do
이제 파일에 awk를 적용하면 파일의 일부가 아닌 전체 파일이 나타나기 때문에 문제가 해결되었습니다. 이전 구문을 사용하여 텍스트 파일을 쓰기 위해 열었지만 불완전하고일부적용된 awk 명령이 작동합니다. inotifywait 이벤트를 create에서 close_write로 변경하면 목적이 달성됩니다.