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'    

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

그래도....

Unix에서 작성하는 모든 명령을 하나의 명령으로 생각하십시오. 명령이 awk, perl, shell 또는 다른 언어로 작성되었는지 여부는 중요하지 않습니다. 내용에 따라 이름을 지정해야 합니다.하다, 구현 방법보다는. 이를 감안할 때, .awkor .sh또는 또는 다른 것으로 끝나는 명령을 사용하여 해당 언어를 나타내서는 안 됩니다. .perl그러면 무엇보다도 awk로 작성된 명령을 Perl로 다시 구현할 수 있고 그 반대의 경우도 마찬가지입니다. 이를 변경하기 위해 호출하는 다른 명령. 따라서 명령 이름은 delayed_by_day_jan20대신 이어야 합니다 delayed_by_day_jan20.awk.

또한 다른 사람들은 awk 구문을 이해하는 편집기를 사용하는 것을 선호하기 때문에 이에 동의하지 않지만 제 생각에는 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 스크립트를 수정하세요(그렇지 않은 경우). 문제가 있으면 새로운 질문을 해주세요.

관련 정보