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
这是我当前的输出,现在我想独立排序每个列,所以所有数字都在同一行。
我该怎么做?
答案 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的版本,你会没事的)