在awk中按字母顺序粘贴两列

时间:2017-05-24 10:23:47

标签: awk

我有一个包含字母列的文件:

1   2
A   C
C   G
T   C
G   C

我正在寻找一种创建列3的方法,其中包含按字母顺序粘贴的两列。 我知道sort,但我正在寻找一种方法来awk。 感谢您的帮助

EDIT

这是输出我正在寻找

3
A:C
C:G
C:T
C:G

2 个答案:

答案 0 :(得分:3)

gawk 方法:

awk 'NR==1{$0=$0 OFS "3"}NR>1{ a[$1]; a[$2]; asorti(a,b); 
     $(NF+1)=b[1]":"b[2]; delete a}1' file | column -t

输出:

1  2  3
A  C  A:C
C  G  C:G
T  C  C:T
G  C  C:G
  • NR==1{$0=$0 OFS "3"} - 将新字段3添加到标题

  • asorti(a,b) - 按索引排序数组ab是包含已排序索引的目标数组

  • $(NF+1) - 指向最后一栏之后的下一个

答案 1 :(得分:1)

在awk中:

$ awk '{print $1,$2,((s=$1+$2)?s:($1<$2?$1 ":" $2:$2 ":" $1))}' file
1 2 3
A C A:C
C G C:G
T C C:T
G C C:G

最后的排序需要通过管道到sort

来完成
$ awk ... | sort
1 2 3
A C A:C
C G C:G
G C C:G
T C C:T

解释一下:

  • ((s=$1+$2) ? s : ...)如果字段值是数字(在这种情况下仅为标题,如果除标题之外的数据是数字,则会导致问题)将它们相加并打印(即1 2 -> 3
  • ($1<$2 ? $1":"$2 : $2":"$1)如果$1按顺序排在$2之前,请打印出来,否则按相反的顺序打印