데이터를 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"
여기서 asMID
는 쉘 변수인 for에 새로 주어진 변수 이름입니다.awk
$machine_ID
-v MNR="$machine_number"
마찬가지로, as라는 이름의 변수를-v
재할당하는 것을 쉘 변수라고 합니다.awk
MNR
$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로 저장합니다.MID
MNR
10
t
print
int
/
60