요일별 백분율을 반환하는 awk

요일별 백분율을 반환하는 awk

따라서 CSV 파일에 항공편 데이터 세트가 있고 지연된 항공편(6열)의 비율을 날짜별로 정렬하고 싶습니다. 0은 지연되지 않은 것이고 1은 15분 이상 지연된 것입니다.

입력:

DAY_OF_MONTH,"DAY_OF_WEEK","ORIGIN","DEST","DEP_TIME","DEP_DEL15","CANCELLED","DIVERTED","DISTANCE"
1,Tuesday,ORD,GRB,1003,0.00,0.00,0.00,322.248
1,Tuesday,TUL,ORD,1027,0.00,0.00,0.00,1083.42
1,Tuesday,EWR,TYS,1848,0.00,0.00,0.00,1168.61

산출:

Weekday, % delayed, delayed, total flights
Tuesday,0.00,0,3

데이터 세트에는 실제로 많은 행이 있고 매월 매일 날짜와 모든 항공편이 있으므로 실제 출력이 아닙니다.

누군가 내가 생각해 내도록 도와주었습니다.

#!/bin/awk
BEGIN { FS = OFS = "," }
FNR > 1 { total[$2]++; if ($6) delay[$2]++ }
END {
    print "\"weekday\"", "\"percentage_delayed\"", "\"delayed\"", "\"total_flights\""
    for ( day in total ) { print day, delay[day] / total[day] * 100, delay[day], total[day]}

}

하지만 이것을 awk 파일에 저장하고 다음과 같이 실행하려고 하면:터미널 출력

답변1

당신 은 #!/bin/awkawk에게 다음을 사용하여 실행하라고 지시하고 있습니다.이름스크립트가 아닌 스크립트로 스크립트를 포함하는 파일의내용물스크립트가 포함된 파일의 다음과 같이 작성하는 것과 같습니다.

awk './delayed_by_day_jan20.awk'

대신에:

awk -f './delayed_by_day_jan20.awk'    

-f명령줄에서 awk 스크립트가 포함된 파일을 지정하는 것과 마찬가지로 awk에게 전달된 파일 이름(예: 현재 스크립트 파일의 이름)을 열고 그 내용을 awk 스크립트로 사용하도록 지시하려면 shebang에서도 사용해야 합니다. 해석하다.

라고 한....

Unix에서 작성하는 모든 명령은 단순한 명령이라고 생각하세요. 해당 명령이 awk, perl, shell 또는 다른 어떤 것으로 작성되었는지는 중요하지 않습니다. 명령이 무엇인지에 따라 이름을 지정해야 합니다.하다, 구현 방법이 아닙니다. 이를 감안할 때, 작성된 언어를 나타내는 다른 것으로 .awk끝나는 .sh명령 을 사용해서는 안 됩니다. .perl이를 변경하려면 해당 명령을 호출하는 다른 모든 명령을 거쳐야 합니다. 따라서 명령 이름은 delayed_by_day_jan20가 아니라 이어야 합니다 delayed_by_day_jan20.awk.

또한 다른 사람들은 awk 구문을 이해하는 편집기를 사용하기를 좋아하기 때문에 이에 동의하지 않지만 IMO에서는 awk를 호출하기 위해 shebang을 사용해서는 안 됩니다. 단지 shebang을 사용하여 사용하는 모든 쉘을 호출한 다음 쉘 스크립트 내에서 awk를 호출하기만 하면 됩니다. 명령줄에서 호출하는 것처럼 말이죠. 그러면 대부분의 작업을 awk에서 수행하는 것이 유용할 뿐만 아니라 그 일부를 셸에서 수행하는 것이 유용한 매우 일반적인 경우(예: 입력 파일의 존재 확인, 임시 파일 생성, 트랩 설정, 명령 인수 분리)에 대한 스크립트의 복잡성이 크게 줄어듭니다. awk 변수 할당과 awk 인수 등. 참조https://stackoverflow.com/a/61002754/1745001그리고구글 "awk shebang"문제에 대한 자세한 내용은

쉘 스크립트를 작성하는 방법은 다음과 같습니다.

$ cat delayed_by_day_jan20
#!/usr/bin/env bash

awk '
BEGIN { FS = OFS = "," }
FNR > 1 { total[$2]++; if ($6) delay[$2]++ }
END {
    print "\"weekday\"", "\"percentage_delayed\"", "\"delayed\"", "\"total_flights\""
    for ( day in total ) {
        printf "%s,%0.2f,%d,%d\n", day, delay[day] / total[day] * 100, delay[day], total[day]
    }
}
' "${@:--}"

$ ./delayed_by_day_jan20 file
"weekday","percentage_delayed","delayed","total_flights"
Tuesday,0.00,0,3

이제 awk 스크립트를 수정하여 원하는 대로 수행하고, 수행하는 데 문제가 있으면 새로운 질문을 하십시오.

관련 정보