单独对每列进行排序

时间:2015-01-05 13:31:44

标签: sorting command-line multiple-columns

cat sanger.* | tr '\-ACGT' '01234' | sed -e 's/\([[:digit:]]\)/\1 /g' 

1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0  
0 2 2 0 0 0 0 2 2 2 2 0 2 0 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 0 2   
0 0 0 0 0 0 3 0 0 0 0 3 0 0 3 0 0 3 0 0 0 0 0 0 3 0 0 0 0 0 0   
0 0 0 4 4 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0   

这是我当前的输出,现在我想独立排序每个列,所以所有数字都在同一行。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我不是在这里排序,而是提取非0位数。

这是一个awk过滤器"更新"每个字段只有(实际上,最新的)非 - " 0"它看到的内容:

# short version
awk '/./ {  if ( NF > maxNF )  {  maxNF=NF }
            for(i=1;i<=NF;i++) {  if ( $i!="0" ) { result[i]=$i } } 
         }
     END {  for(i=1;i<=maxNF;i++) { printf "%s ",result[i] } }
     '

# expanded version (ie, the same as above, with different indentation to mhelp reading)
awk '/./ {  if ( NF > maxNF )  
              {  maxNF=NF }
            for(i=1;i<=NF;i++) 
              {  if ( $i!="0" )
                   { result[i]=$i } 
              } 
         }
     END {  for(i=1;i<=maxNF;i++) 
              { printf "%s ",result[i] 
              } 
         }
    '

所以,如果我将发布的结果粘贴到该过滤器中:

echo "
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0  
0 2 2 0 0 0 0 2 2 2 2 0 2 0 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 0 2   
0 0 0 0 0 0 3 0 0 0 0 3 0 0 3 0 0 3 0 0 0 0 0 0 3 0 0 0 0 0 0   
0 0 0 4 4 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 
" | awk '/./ {  if ( NF > maxNF )  {  maxNF=NF }
                for(i=1;i<=NF;i++) {  if ( $i!="0" ) { result[i]=$i } } 
             }
         END {  for(i=1;i<=maxNF;i++) { printf "%s ",result[i] } }
        '

输出:

1 2 2 4 4 1 3 2 2 2 2 3 2 4 3 4 1 3 2 2 2 1 2 1 3 4 1 1 1 1 2 

(注意:额外的&#34;&#34;最后,这里......)

然而,警告的注意事项:原始awk的非常旧版本(可能还有一些nawk)仅限于99个字段...(现在很少遇到。如果你使用GNU的版本,你会没事的)