Bash 스크립트에서 awk'ed 데이터를 인쇄할 수 없습니다

Bash 스크립트에서 awk'ed 데이터를 인쇄할 수 없습니다

데이터를 csv 파일(my_datum_file.csv)에 덤프하고 있습니다. 이것콘텐츠모두 쉼표로 구분되어 있습니다. 찾고 싶습니다.마지막네 번째 매개변수의 인스턴스(즉, MX3, TMX, MSV 등에 대해 인쇄된 데이터의 마지막 인스턴스). 5번째 매개변수는 4번째 매개변수의 "하위 클래스"입니다(즉, TMX에는 098과 001이 있습니다). 일곱 번째 매개변수가 "SVlts"가 아니라 "상태"라는 것도 중요합니다.묻다:10번째 값(분 단위의 시간)을 시간으로 변환하고 싶습니다. 이 값을 인쇄하고 싶습니다.

그래서 나는 터미널에서 다음과 같이 썼습니다.

$ cat /home/ed/start_up_job/my_datum_file.csv | awk -F, '( $4 == "TMX" ) && ( $5 == "098" ) && ( $7 == "status" ) {print $10/60}' | tail -1`'

최종 결과는 1022.25시간입니다. 이는 훌륭한 결과입니다.

나는 이것을 일반적인 작은 bash 스크립트에 포함시켰습니다.

#!/bin/bash

machine_ID="$1"
machine_number="$2"

echo "$1 $2 hours is `awk -F, -v MID="$machine_id" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv`"

따라서 터미널에서 bash 스크립트를 호출하면 $ ./myscript.txt TMX 098다음과 같은 출력이 나타납니다. TMX 098 hours is: 0 예상 출력은 다음과 같습니다.TMX 098 hours is: 1022.25

무슨 문제인지 모르겠어요?

답변1

cat터미널에서 사용했던 것을 교체 하고 awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv작동했습니다.

코드 이해:

  • awk -F필드 구분자를 다음과 같이 정의합니다.,
  • -v프로그램 변수에 값 할당
  • MID="$machine_ID"여기서 as MID는 쉘 변수인 for에 새로 주어진 변수 이름입니다.awk$machine_ID
  • -v MNR="$machine_number"마찬가지로, as라는 이름의 변수를 -v재할당하는 것을 쉘 변수라고 합니다.awkMNR$machine_number
  • ( $4 == MID )4번째 인수를 MID포함된 것과 동일 하게 만듭니다.
  • &&그리고
  • ( $5 == MNR )5번째 인수를 MNR포함된 것과 동일 하게 만듭니다.
  • &&그리고
  • ( $7 == "status" )7번째 매개변수를 다음과 같게 만드세요 .status
  • {t=$10}10번째 값을 다음에 할당합니다 .t
  • END모든 입력을 읽은 후 한 번 실행되는 규칙입니다.
  • print int(t/60)인쇄물t/60 (앞에 $ 기호가 없습니다 t.)int에거 로서
  • /home/ed/start_up_job/my_datum_file.csv파일에서~

기본적으로 파일에서 이 코드는 /home/ed/start_up_job/my_datum_file.csv합계가 포함된 값을 찾습니다. 그런 다음 코드는 [$]번째 매개변수의 값을 입력하고 ing 이후에 이를 eger로 저장합니다.MIDMNR10tprintint/60

관련 정보