dis*_*lus 6 unix bash perl awk
如何删除包含所有零的文本文件中的行(行)和列.例如,我有一个文件:
1 0 1 0 1
0 0 0 0 0
1 1 1 0 1
0 1 1 0 1
1 1 0 0 0
0 0 0 0 0
0 0 1 0 1
Run Code Online (Sandbox Code Playgroud)
我想删除第2行和第4行以及第2列.输出应如下所示:
1 0 1 1
1 1 1 1
0 1 1 1
1 1 0 0
0 0 1 1
Run Code Online (Sandbox Code Playgroud)
我可以使用sed和egrep来做到这一点
sed '/0 0 0 0/d' or egrep -v '^(0 0 0 0 )$'
Run Code Online (Sandbox Code Playgroud)
对于带有零的行,但对于具有数千列的文件来说太不方便了.我不知道如何删除全部为零的列,第二列.
另一个 awk 变体:
awk '{show=0; for (i=1; i<=NF; i++) {if ($i!=0) show=1; col[i]+=$i;}} show==1{tr++; for (i=1; i<=NF; i++) vals[tr,i]=$i; tc=NF} END{for(i=1; i<=tr; i++) { for (j=1; j<=tc; j++) { if (col[j]>0) printf("%s%s", vals[i,j], OFS)} print ""; } }' file
Run Code Online (Sandbox Code Playgroud)
扩展形式:
awk '{
show=0;
for (i=1; i<=NF; i++) {
if ($i != 0)
show=1;
col[i]+=$i;
}
}
show==1 {
tr++;
for (i=1; i<=NF; i++)
vals[tr,i]=$i;
tc=NF
}
END {
for(i=1; i<=tr; i++) {
for (j=1; j<=tc; j++) {
if (col[j]>0)
printf("%s%s", vals[i,j], OFS)
}
print ""
}
}' file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2001 次 |
| 最近记录: |