删除全部为零的行和列

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)

对于带有零的行,但对于具有数千列的文件来说太不方便了.我不知道如何删除全部为零的列,第二列.

anu*_*ava 3

另一个 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)