날짜와 특정 수량의 해당 측정값이 포함된 데이터 파일이 있습니다. 전체 파일은 13년 분량이며 약 4500개의 데이터 포인트를 포함합니다. 아래에 형식의 예를 제시했습니다. 매일 측정할 필요는 없습니다. 즉, 일부 날짜는 "pbl"이라는 제목의 데이터 열에 있는 빈 값에 해당합니다.
데이터 세트의 각 연도에 대한 관측치 수(즉, 0이 아닌 값의 수)와 합계를 계산하고 싶습니다. 그런 다음 이것을 매달 반복하겠습니다. 약간의 속임수를 쓰기 위해 전체 날짜를 "연도"와 "월-연도"로 줄이는 열을 추가하여 작업을 더 쉽게 만들었습니다.
나는 awk를 사용하고 있으며 올바르게 합계할 수 있습니다. 문제는 계산입니다. 현재 내 awk 라인은 연간(또는 월)당 일 수를 계산하고아니요관측치 수. 따라서 전체 데이터 세트에 대해 "365" 또는 "366"을 얻습니다. 이는 날짜 열에 나열된 총 항목 수입니다. 내가 얻고자 하는 것은 "에 해당하는 측정값이 있는 날짜의 수입니다. pbl' 열입니다.
내 직감은 어딘가에 "0이 아닌 항목" 조항을 포함하거나 $2 대신 $4를 사용해야 한다는 것인데 어떻게 해야 할지 모르겠습니다. 어떤 조언이라도 감사하겠습니다!
내 코드:
awk -F, '{a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv
내 데이터(샘플):
"날짜", "연도", "월-연도", "pbl"
2004년 5월 12일,"12-2004",960.295
2004년 6월 12일,"12-2004",
2004년 13월 12일,"12-2004",911.774
2004년 12월 4일,"12-2004",2804.06
2004년 12월 4일,"12-2004",4453.56
2005년 1월 1일, "01-2005",1326.38
2005년 7월 1일/05,"01-2005",
2005년 8월 1일/05,"01-2005",604.919
2005년 9월 1일/05,"01-2005",755.006
2005년 10월 1일, "01-2005",
2005년 11월 1일,"01-2005",978.818
2005년 12월 1일, "01-2005",
2005년 13월 1일, "01-2005",1644.87
2005년 4월 5일 29일,"04-2005",3630.62
2005년 4월 5일 30일,"04-2005",3780.11
2005년 1월 5일, "05-2005",1262.66
2005년 2월 5일/05,"05-2005",
2006년 2월 6일 14일,"02-2006",5667.58
2006년 2월 6일 15일,"02-2006",2696.56
2007년 7월 23일,"07-2007",1276.06
2007년 7월 24일,"07-2007",
답변1
값이 다음과 같은 행만 처리하면 됩니다 $4
.
awk -F, '$4 {a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv
이것은 작동합니다.
$4 {a[$2]++; count[$2]+=$NF}
블록이 true로 평가되는 행에서만 실행되도록 합니다 $4
.즉$4
비어 있지 않고 0도 아닙니다 .