여러 개의 데이터 샘플이 있는데 데이터 샘플 전후에 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]/
다음을 수행합니다.변수가
z
비어 있지 않으면 첫 번째 문자를 건너뛰고 인쇄합니다.현재 줄(0이 아닌 줄)을 인쇄합니다.
z
빈 문자열로 다시 설정합니다 .f
0이 아닌 선이 표시됨을 나타내기 위해 플래그를 1로 설정합니다 .나머지 명령을 건너뛰고 다시 시작하기 위해 점프합니다
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