根据另一个列的值对列进行排序

时间:2014-06-26 15:04:34

标签: awk

我有一个具有以下结构的文件:

输入

1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 T:0.966667  A:0.0333333 T

我想要做的是改变第五和第六列的位置,使得一列获得与第七列相同的顺序。您可以在示例中看到。在第七列中,我们有T,C,T,在改变之后,T,C,A的第六列在输出中变为T,C,T,即在第三行,第五列的位置与第七列相比,第六列已切换。

输出

1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 A:0.0333333 T:0.966667  T

我希望我能解释清楚,我找不到解决办法,你能不能给我一个暗示如何做到这一点?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,也许这对你有用吗?

:提交a.awk

substr($6,1,1) == $7 { print }
substr($6,1,1) != $7 { print $1, $2, $3, $4, $6, $5, $7 }

:file a.txt

1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 T:0.966667  A:0.0333333 T

bash-3.2 $ awk -f a.awk a.txt

1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 A:0.0333333 T:0.966667  T

答案 1 :(得分:2)

使用输出作为制表符分隔符并且所有列都对齐。

awk -F'[ :]*'  '{if($7 == $9 ) print $1,$2,$3,$4,$5,$6,$7,$8,$9; else print $1,$2,$3,$4,$7,$8,$5,$6,$9}' input.txt|column -t

输出:

1  30923  2  300  G  0.503333   T  0.496667   T
1  51476  2  300  T  0.986667   C  0.0133333  C
1  51479  2  300  A  0.0333333  T  0.966667   T