删除具有相同值的列

时间:2015-02-10 11:04:46

标签: unix awk sed

我有一个庞大的数据集,我想删除具有相同值-9的列。我有20行和数百万列。

我想删除第1,9,11列(它们都与-9的值相同)这只是我数据集的一小部分。我无法计算哪些列的全部数据集都是-9。

感谢您的帮助,

谢谢!

样品1-9 3 -9 0 -9 2 -9 -9 -9 1 -9

sample2 -9 -9 0 -9 0 2 -9 -9 -9 -9 -9

样本3 -9 -9 -9 -9 -9 2 3 1 -9 -9 -9

样本4 -9 -9 -9 -9 -9 2 -9 1 -9 -9 -9

输出;

样品1 3 -9 0 -9 2 -9 -9 1

样品2-9 0 -9 0 2 -9 -9 -9

样品3 -9 -9 -9 -9 2 3 1 -9

样品4 -9 -9 -9 -9 2 -9 1 -9

我试图用perl删除它。

1 个答案:

答案 0 :(得分:0)

你可以尝试下面的awk脚本。

cat a.txt | awk '{
                  for (Col = 1; Col <= NF; Col++) { a[NR, Col] = $Col } 
                 }         
                 END {    
                   for (Col = 1; Col <= NF ; Col++) { 
                      j=0;  
                      for( Row = 1 ; Row<= NR; Row++) 
                      { 
                         if (a[Row,Col] != -9 ) 
                          { j=1 } 
                      } 
                      if( j == 0 ) { continue;} 
                      for(Row=1; Row<= NR; Row++){ 
                         printf a[Row,Col] (Row==NR ? RS : FS)  
                      } 
                    } 
                }' | awk '{
                  for (Col = 1; Col <= NF; Col++) { a[NR, Col] = $Col } 
                 }         
                 END {    
                   for (Col = 1; Col <= NF ; Col++) { 
                      for(Row=1; Row<= NR; Row++){ 
                         printf a[Row,Col] (Row==NR ? RS : FS)  
                      } 
                    } 
                }'


测试:

  • INPUT:
    -9 1 2 2 -9 0
    -9 -9 2 5 -9 3
    -9 2 3 3 -9 -9
    -9 7 4 6 -9 4
  • 输出:
    1 2 2 0
    -9 2 5 3
    2 3 3 -9
    7 4 6 4


步骤:      

  1. 转置矩阵(然后每列将成为行)
  2. 然后排除已获得全部-9值的行
  3.       
  4. 再次转置矩阵
  5.     
    参考:link