我有几个数据样本,我需要在数据样本之前和之后删除零。然而,由于显而易见的原因,我必须保留数据样本之间的零。我怎样才能用 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
这将从文件的开头和结尾删除所有零,同时保留中间的零:
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]/
则我们执行以下操作:如果变量
z
非空,我们将打印它,并跳过它的第一个字符。我们打印当前行(非零行)。
我们设置
z
回一个空字符串。我们将标志设置
f
为 1 表示我们看到了一条非零的线。我们跳过其余的命令并跳转到重新开始就行了
next
。
f{z=z"\n"$0}
如果我们到达此命令,则意味着该行不包含非零字符。如果我们看到非零行,换句话说,如果
f
是 1,那么我们将追加到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