일별, 하위일 데이터가 혼합된 상태에서 하위일 값을 추가하고 균일한 일별 데이터를 생성하여 균일한 일별 데이터를 준비하고 싶습니다. 내 샘플 입력 및 필수 출력 데이터는 다음과 같습니다.
입력 파일:
date Value
01/01/2000 2
01/01/2000 2
01/02/2000 6
01/03/2000 5
01/03/2000 4
필수 출력 파일:
date Value
01/01/2000 4 (i.e. 2+2)
01/02/2000 6
01/03/2000 9(i.e 5+4)
답변1
행이 시간순으로 정렬된 경우:
awk '
NR==1{print;next}
$1!=l && NR>2{print l,n;n=0}
{n+=$2;l=$1}
END{if (NR>1) print l,n}' < input.file > output.file
즉, 첫 번째 필드가 마지막 행과 다르다는 것을 확인하면 개수를 출력합니다. 즉, 모든 데이터를 메모리에 보관하고 표시가 끝날 때까지 기다릴 필요가 없습니다.배런스또는지속 가능한 개발 관리해결책. 이는 또한 주문이 자동으로 보류됨을 의미합니다.
답변2
AWK와 연관 배열을 사용하여 이를 수행할 수 있습니다.
awk '{
if (NR == 1) { print $0 }
else { count[$1] += $2 }
}
END {
# Sort the items based on the date
n = asorti(count, indices)
for (i = 1; i <= n; i++) {
print indices[i], count[indices[i]]
}
}' < file_name
이 블록은 모든 레코드가 처리된 마지막에 실행됩니다 END
.
배열 정렬이 다음과 같이 변경되었습니다.이 게시물.
답변3
다음 스크립트를 사용할 수 있습니다 awk
.
$ awk '
{ a[$1]+=$2 }
END{ for(val in a) printf("%s %s\n", val, a[val]) }
' <(tail -n +2 sample.txt)
그러나 이 접근 방식을 사용하면 더 이상 출력 순서가 유지되지 않습니다. 데이터가 날짜 숫자 순서대로 되어 있으면 sort
마지막에 간단한 작업을 수행하면 출력 크기가 다시 조정됩니다.
예
샘플 데이터를 가정합니다.
$ cat sample.txt
date Value
01/01/2000 2
01/01/2000 2
01/02/2000 6
01/03/2000 5
01/03/2000 4
위 스크립트는 다음과 같은 결과를 생성합니다.
$ awk '
{ a[$1]+=$2 }
END{ for(val in a) printf("%s %s\n", val, a[val]) }
' <(tail -n +2 sample.txt)
01/02/2000 6
01/01/2000 4
01/03/2000 9
출력을 실행하면 sort
데이터의 크기가 조정됩니다.
$ awk '
{ a[$1]+=$2 }
END{ for(val in a) printf("%s %s\n", val, a[val]) }
' <(tail -n +2 sample.txt)|sort
01/01/2000 4
01/02/2000 6
01/03/2000 9
원본 파일의 헤더는 다음과 같이 다시 추가할 수 있습니다.
$ (head -n 1 sample.txt; awk '{a[$1]+=$2}END{for(val in a) printf("%s %s\n", val, a[val])}' <(tail -n +2 sample.txt)|sort)
date Value
01/01/2000 4
01/02/2000 6
01/03/2000 9
읽기 쉽도록 조금 확장할 수 있습니다.
$ (
head -n 1 sample.txt
awk '
{ a[$1]+=$2 }
END{ for(val in a) printf("%s %s\n", val, a[val]) }
' <(tail -n +2 sample.txt) | sort
)
date Value
01/01/2000 4
01/02/2000 6
01/03/2000 9
업데이트 #1
댓글에 있는 @StephaneChazelas의 피드백을 바탕으로 예시를 더욱 단순화했습니다. this()를 사용하여 tail ...
블록 내부로 이동하면 제거할 수 있습니다. 첫 번째 줄을 건너뜁니다.awk
NR==1{ next }
sample.txt
| sort
블록 내에서도 위치를 옮겼습니다 END{...}
. sort
날짜를 기준으로 데이터에서 생성된 출력의 크기가 계속 조정됩니다 . 지금 호출 중이므로 awk
큰 따옴표로 묶습니다.awk
/bin/sort
$ awk '
NR==1{ print; next }
{ a[$1]+=$2 }
END{ for(val in a) print val, a[val] | "sort" }
' sample.txt
)
date Value
01/01/2000 4
01/02/2000 6
01/03/2000 9
답변4
나는 Perl에서 이것을 할 것이다:
perl -ane '$.==1 && do{$first=$_; next}; $k{$F[0]}+=$F[1]; END{foreach (keys(%k)){print "$_\t$k{$_}\n"}}' file
01/01/2000 4
01/03/2000 9
01/02/2000 6
이 접근 방식의 장점은 행을 시간순으로 정렬할 필요가 없다는 것입니다.