시끄러운 데이터가 포함된 CSV 파일을 강력하게 분할합니다.

시끄러운 데이터가 포함된 CSV 파일을 강력하게 분할합니다.

다음 열을 포함하는 csv 파일이 있다고 가정해 보겠습니다.

timestamp,cpu,memory

실제 데이터 형태의 예는 다음과 같습니다.

CPU/Mem CSV 데이터 차트

이러한 방식으로 데이터를 시각화함으로써 인간의 눈은 CPU를 많이 사용하는 네 가지 활동이 어디에서 시작하고 끝나는지 쉽게 확인할 수 있습니다.

R이상적으로 는 등 을 사용하지 않고 표준 Unix 명령줄 도구를 사용하는 간단한 방법은 무엇입니까 octave?"grep"은 이 4가지 활동의 시작과 끝을 나타내는 파일의 8줄만 표시합니다., "cpu" 열을 기반으로 합니까?

분명히 이것은 약간 모호하고 데이터에 노이즈가 있지만 시작/끝에 가까운 8줄을 제공하는 솔루션은 높이 평가됩니다.

csv 파일에서 짧게 발췌한 내용으로, 4가지 활동 급증 중 첫 번째 활동만 표시됩니다.

10:44:21.310,0,53567488
10:44:22.310,1.56257,53575680
10:44:23.326,0,53854208
10:44:24.325,34.3761,57405440
10:44:25.325,73.43985,61747200
10:44:26.325,3.1251,69459968
10:44:27.325,0,69459968
10:44:28.325,0,69459968
10:44:29.325,65.6271,74756096
10:44:30.325,53.1267,77783040
...
10:50:56.450,35.93865,142700544
10:50:57.450,10.93785,142897152
10:50:58.450,1.56255,142897152
10:50:59.450,0,142897152
10:51:00.450,0,142897152
10:51:01.450,0,142897152

이상적으로는 다음 두 줄이 생성됩니다.

10:44:24.325,34.3761,57405440
10:50:58.450,1.56255,142897152

10:44:26.325그러나 그 사이에 몇 초 동안 CPU 활동이 없기 때문에 10:44:28.325대답이 그렇게 똑똑하고 데이터를 "부드럽게"하는 것과 같은 작업을 수행하지 않을 것이라고 생각합니다. 따라서 위와 같은 csv 조각이 다음 4개의 행을 생성하면 충분합니다.

10:44:24.325,34.3761,57405440
10:44:26.325,3.1251,69459968
10:44:29.325,65.6271,74756096
10:50:58.450,1.56255,142897152

답변1

한 가지 방법은 awk임계값에 도달하는 첫 번째 행과 그 아래에 있는 마지막 행을 가져오도록 임계값을 설정하는 것입니다. 다음과 같이 작동할 수 있습니다.

awk -F, -vthreshold_up=20 -vthreshold_down=10 'BEGIN {
                          cur = "gt";
                        } 
                        {
                          if (cur == "gt" && $2 > threshold_up) {
                            print;
                            cur = "lt";
                          } else if (cur = "lt" && $2 < threshold_down) {
                            print;
                            cur = "gt";
                          }
                        }' file.csv

답변2

jordanm의 접근 방식을 확장함으로써 통계에 의존하지 않고도 놀랍도록 강력한 기능을 구축할 수 있었습니다. 안타깝게도 스크립트가 약간 길어졌지만 이 작업이 완료되었으므로 이제 원할 때마다 사용할 수 있습니다. 올바른 매개변수만 알아내면 됩니다.

나는 12개의 실제 데이터 파일을 테스트했는데 그 중 일부는 다음과 같이 지저분했습니다.

지저분한 CPU 및 메모리 CSV 차트

여기서의 비결은 MIN_DURATION일시적인 급증을 무시하고 지정된 행 수까지 하락하는 데 도움이 되는 변수를 사용하는 것입니다.

용법:

grep-begin-end FIELD_SEPARATOR FIELD_INDEX THRESHOLD_UP THRESHOLD_DOWN MIN_DURATION ...

예:

grep-begin-end , 2 30 4 5 file.csv

grep 시작 끝

FIELD_SEPARATOR=$1
FIELD_INDEX=$2
THRESHOLD_UP=$3
THRESHOLD_DOWN=$4
MIN_DURATION=$5
shift 5
awk -F$FIELD_SEPARATOR -vthreshold_up=$THRESHOLD_UP -vthreshold_down=$THRESHOLD_DOWN 'BEGIN {
    cur = "gt";
}
{
    val = $'$FIELD_INDEX';
    # strip of double quotes and convert to number
    if (substr(val, 1, 1) == "\"") { val = 0 + substr(val, 2, length(val) - 3); } else { val = 0 + val; }
    buf = "";
    if (cur == "gt")
    {
        if (val >= threshold_up)
        {
            if (buf == "")
                buf = $0;
            if (duration >= '$MIN_DURATION')
            {
                print buf;
                cur = "lt";
                duration = 0;
                buf = "";
            }
            else
            {
                duration++;
            }
        }
        else
        {
            duration = 0;
        }
    }
    else if (cur == "lt")
    {
        if (val <= threshold_down)
        {
            if (buf == "")
                buf = $0;
            if (duration >= '$MIN_DURATION')
            {
                print buf;
                cur = "gt";
                duration = 0;
                buf = "";
            }
            else
            {
                duration++;
            }
        }
        else
        {
            duration = 0;
        }
    }
}' "$@"

답변3

현재 값이 이전 값과 N 이상 차이나는 경우 이를 인쇄하는 작은 스크립트를 작성할 수 있을 것 같습니다. 데이터가 매우 불연속적인 것처럼 보이고 측정마다 변경이 발생하므로 이 방법이 작동합니다.

그것은 마치

awk -F, -v thr=100 '{if ($2-last>thr || last-$2>thr){print;} last=$2;}' foo.csv

관련 정보