데이터 샘플링 전후에 0으로 나누기

데이터 샘플링 전후에 0으로 나누기

여러 개의 데이터 샘플이 있는데 데이터 샘플 전후에 0을 제거해야 합니다. 그러나 분명한 이유로 데이터 샘플 사이에 0을 유지해야 합니다. awk나 sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?

감사해요.

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4.40
21.20
17.44
18.24
2.08
19.92
14.56
21.20
6.64
0
27.04
32.24
65.28
12.00
40.80
30.48
30.16
30.24
0
62.56
6.56
29.76
0
43.84
13.44
17.12
54.48
23.52
30.72
29.04
11.04
14.56
5.76
31.60
13.68
11.20
17.44
17.44
0
36.56
16.64
32.40
18.40
0
104
9.84
1.68
63.84
19.28
5.76
28.00
12.64
0
0
136
13.28
23.28
1.20
19.12
27.28
0
2.88
36.16
27.44
13.60
36.32
20.96
15.84
23.12
10.24
.96
43.60
8.32
0
0
61.60
20.00
31.36
32.80
0
72.32
27.04
9.52
21.28
2.08
44.48
11.20
26.40
19.92
18.40
0
78.32
13.04
38.88
6.24
66.64
4.56
25.12
43.20
4.00
58.08
18.40
2.48
20.32
15.76
24.96
0
28.40
28.64
32.72
6.64
14.72
0
0
0
0
0

답변1

이렇게 하면 파일의 시작과 끝에서 모든 0이 제거되고 중간에는 0이 유지됩니다.

awk '/[^0]/{if (z)print substr(z,2);print;z="";f=1;next} f{z=z"\n"$0}' file

어떻게 작동하나요?

  • /[^0]/{if (z)print substr(z,2); print;z=""; f=1; next}

    현재 줄에 0이 아닌 문자가 있으면 /[^0]/다음을 수행합니다.

    1. 변수가 z비어 있지 않으면 첫 번째 문자를 건너뛰고 인쇄합니다.

    2. 현재 줄(0이 아닌 줄)을 인쇄합니다.

    3. z빈 문자열로 다시 설정합니다 .

    4. f0이 아닌 선이 표시됨을 나타내기 위해 플래그를 1로 설정합니다 .

    5. 나머지 명령을 건너뛰고 다시 시작하기 위해 점프합니다 next.

  • f{z=z"\n"$0}

    이 명령에 도달하면 해당 줄에 0이 아닌 문자가 포함되어 있지 않음을 의미합니다. 0이 아닌 줄이 보이면, 즉 1이면 줄 바꿈과 현재 줄 f에 추가됩니다 .z

실시예 1

다음 문서를 고려해보세요:

$ cat file2
0
0
2.08
0
18.40
0
0

이 명령은 다음과 같은 출력을 생성합니다.

$ awk '/[^0]/{if (z)print substr(z,2);print;z="";f=1;next} f{z=z"\n"$0}' file2
2.08
0
18.40

실시예 2

입력 파일 사용

$ awk '/[^0]/{if (z)print substr(z,2);print;z="";f=1;next} f{z=z"\n"$0}' file
4.40
21.20
17.44
18.24
2.08
19.92
14.56
21.20
6.64
0
27.04
32.24
65.28
12.00
40.80
30.48
30.16
30.24
0
62.56
6.56
29.76
0
43.84
13.44
17.12
54.48
23.52
30.72
29.04
11.04
14.56
5.76
31.60
13.68
11.20
17.44
17.44
0
36.56
16.64
32.40
18.40
0
104
9.84
1.68
63.84
19.28
5.76
28.00
12.64
0
0
136
13.28
23.28
1.20
19.12
27.28
0
2.88
36.16
27.44
13.60
36.32
20.96
15.84
23.12
10.24
.96
43.60
8.32
0
0
61.60
20.00
31.36
32.80
0
72.32
27.04
9.52
21.28
2.08
44.48
11.20
26.40
19.92
18.40
0
78.32
13.04
38.88
6.24
66.64
4.56
25.12
43.20
4.00
58.08
18.40
2.48
20.32
15.76
24.96
0
28.40
28.64
32.72
6.64
14.72

관련 정보